Java 用空格分割的字符串不起作用
Java String split by whitespace not working
我正在尝试将输入字符串传递到 HashMap 的 ArrayList 中,并为其编写了一个方法。
public static ArrayList<HashMap<String, String>> tagSeparator (String input) {
ArrayList<HashMap<String, String>> listOfTags = new ArrayList<HashMap<String, String>>();
HashMap<String, String> newTags = new HashMap<String, String>();
for (String eachLine: input.split("/>")) {
eachLine = (eachLine.trim()).substring(eachLine.indexOf("<")+1);
newTags.put("TagName", eachLine.substring(0, eachLine.indexOf(" ")));
eachLine = eachLine.substring(eachLine.indexOf(" "));
for (String AttrVal: eachLine.split(CharMatcher.WHITESPACE.toString())) {
System.out.println("AttrVal: " + AttrVal);
String Attr = AttrVal.substring(0, AttrVal.indexOf("="));
String Val = CharMatcher.is('"').trimFrom(AttrVal.substring(AttrVal.indexOf("=")));
newTags.put(Attr, Val);
}
listOfTags.add(newTags);
newTags.clear();
}
return listOfTags;
}
我给出的输入如下 -
<AssinaturaTax12110000 Tag="12110000" TaxName="ICMS" TaxRate="25.00" TaxAmount="24.75"/>
<AssinaturaTax12110000 Tag="12110000" TaxName="PIS" TaxRate="0.65" TaxAmount="0.64"/>
<AssinaturaTax12110000 Tag="12110000" TaxName="COFINS" TaxRate="3.00" TaxAmount="2.97"/>
第一个 for-each 循环应该分隔行,第二个 for-each 循环应该分隔每行中的 AVP。我在第二个 for-each 循环中使用 Guava 来识别空格。虽然第一个 for-each 循环按预期工作,但在第二个循环中,字符串拆分不起作用。我已经尝试使用正则表达式“”、“\\s+”和“\\s”,以及 Apache Commons StringUtils split 方法,但未能产生所需的输出。
存在 StringIndexOutOfBounds 异常,控制台输出如下 -
AttrVal: Tag="12110000" TaxName="ICMS" TaxRate="25.00" TaxAmount="24.75"
我哪里错了?
我发现您的代码存在一些问题:
- 您确实应该使用 Biffen 建议的 XML 解析器。它让生活变得更轻松并防止错误。
- 第二个 for-each 语句根据空白字符拆分。但是,字符串本身以空白字符开头(在我的计算机上:[ Tag="12110000" TaxName="ICMS" TaxRate="25.00" TaxAmount="24.75"])。在按空格拆分后,第一部分是一个空字符串,您尝试从中获取一个子字符串,这显然是不可能的。要解决此问题,只需使用:
for (String AttrVal: eachLine.trim().split("[\s]+"))
而不是 for (String AttrVal: eachLine.split("[\s]+"))
。 trim() 函数自动删除字符串开头和结尾的空白字符。
- 您将 HashMap 添加到 ArrayList,然后清除 HashMap。由于 ArrayList 保留对映射的引用,因此您最终会得到一个空 HashMap 的 ArrayList。为输入中的每一行构造一个新的 HashMap,或者使用以下构造函数创建您拥有的 HashMap 的副本:
HashMap<String,String> copy = new HashMap(newTags);
。然后将副本添加到 ArrayList。通过使用该构造函数,将复制 newTags 中的所有值,并且不会保留对 newTags 的引用,因此您可以对 newTags 做任何您想做的事情,例如清除它。
我正在尝试将输入字符串传递到 HashMap 的 ArrayList 中,并为其编写了一个方法。
public static ArrayList<HashMap<String, String>> tagSeparator (String input) {
ArrayList<HashMap<String, String>> listOfTags = new ArrayList<HashMap<String, String>>();
HashMap<String, String> newTags = new HashMap<String, String>();
for (String eachLine: input.split("/>")) {
eachLine = (eachLine.trim()).substring(eachLine.indexOf("<")+1);
newTags.put("TagName", eachLine.substring(0, eachLine.indexOf(" ")));
eachLine = eachLine.substring(eachLine.indexOf(" "));
for (String AttrVal: eachLine.split(CharMatcher.WHITESPACE.toString())) {
System.out.println("AttrVal: " + AttrVal);
String Attr = AttrVal.substring(0, AttrVal.indexOf("="));
String Val = CharMatcher.is('"').trimFrom(AttrVal.substring(AttrVal.indexOf("=")));
newTags.put(Attr, Val);
}
listOfTags.add(newTags);
newTags.clear();
}
return listOfTags;
}
我给出的输入如下 -
<AssinaturaTax12110000 Tag="12110000" TaxName="ICMS" TaxRate="25.00" TaxAmount="24.75"/>
<AssinaturaTax12110000 Tag="12110000" TaxName="PIS" TaxRate="0.65" TaxAmount="0.64"/>
<AssinaturaTax12110000 Tag="12110000" TaxName="COFINS" TaxRate="3.00" TaxAmount="2.97"/>
第一个 for-each 循环应该分隔行,第二个 for-each 循环应该分隔每行中的 AVP。我在第二个 for-each 循环中使用 Guava 来识别空格。虽然第一个 for-each 循环按预期工作,但在第二个循环中,字符串拆分不起作用。我已经尝试使用正则表达式“”、“\\s+”和“\\s”,以及 Apache Commons StringUtils split 方法,但未能产生所需的输出。
存在 StringIndexOutOfBounds 异常,控制台输出如下 -
AttrVal: Tag="12110000" TaxName="ICMS" TaxRate="25.00" TaxAmount="24.75"
我哪里错了?
我发现您的代码存在一些问题:
- 您确实应该使用 Biffen 建议的 XML 解析器。它让生活变得更轻松并防止错误。
- 第二个 for-each 语句根据空白字符拆分。但是,字符串本身以空白字符开头(在我的计算机上:[ Tag="12110000" TaxName="ICMS" TaxRate="25.00" TaxAmount="24.75"])。在按空格拆分后,第一部分是一个空字符串,您尝试从中获取一个子字符串,这显然是不可能的。要解决此问题,只需使用:
for (String AttrVal: eachLine.trim().split("[\s]+"))
而不是for (String AttrVal: eachLine.split("[\s]+"))
。 trim() 函数自动删除字符串开头和结尾的空白字符。 - 您将 HashMap 添加到 ArrayList,然后清除 HashMap。由于 ArrayList 保留对映射的引用,因此您最终会得到一个空 HashMap 的 ArrayList。为输入中的每一行构造一个新的 HashMap,或者使用以下构造函数创建您拥有的 HashMap 的副本:
HashMap<String,String> copy = new HashMap(newTags);
。然后将副本添加到 ArrayList。通过使用该构造函数,将复制 newTags 中的所有值,并且不会保留对 newTags 的引用,因此您可以对 newTags 做任何您想做的事情,例如清除它。