我试图将输入字符串传递给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分开。我使用Guava来识别第二个for-each循环中的Whitespace。虽然第一个for-each循环按预期工作,但在第二个循环的情况下,String拆分不起作用。我已经尝试使用正则表达式“”,“\\ s +”和“\\ s”,以及Apache Commons StringUtils拆分方法,但未能产生所需的输出。
有一个StringIndexOutOfBounds异常,控制台输出如下所示 -
AttrVal: Tag="12110000" TaxName="ICMS" TaxRate="25.00" TaxAmount="24.75"
我哪里错了?
答案 0 :(得分:0)
我发现您的代码存在一些问题:
for (String AttrVal: eachLine.trim().split("[\\s]+"))
代替for (String AttrVal: eachLine.split("[\\s]+"))
。 trim()函数自动删除String的开头和结尾处的空白字符。HashMap<String,String> copy = new HashMap(newTags);
。然后将副本添加到ArrayList。通过使用该构造函数,newTags中的所有值都被复制,并且不会对newTags保留任何引用,因此您可以使用newTag执行任何操作,例如清除它。