Java字符串由空格分割不起作用

时间:2015-08-06 21:07:59

标签: java regex arraylist hashmap string-split

我试图将输入字符串传递给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"

我哪里错了?

1 个答案:

答案 0 :(得分:0)

我发现您的代码存在一些问题:

  1. 你真的应该使用像Biffen建议的XML解析器。它让生活变得更轻松,防止错误。
  2. 第二个for-each语句在空白字符上分割。然而,字符串本身以空格字符开头(在我的计算机上:[Tag =&#34; 12110000&#34; TaxName =&#34; ICMS&#34; TaxRate =&#34; 25.00&#34; TaxAmount =&# 34; 24.75&#34;])。在空格上拆分后,第一个是一个空字符串,你试图从中获取一个显然不可能的子字符串。要解决此问题,只需使用:for (String AttrVal: eachLine.trim().split("[\\s]+"))代替for (String AttrVal: eachLine.split("[\\s]+"))。 trim()函数自动删除String的开头和结尾处的空白字符。
  3. 您将HashMap添加到ArrayList,然后清除HashMap。由于ArrayList保留了对地图的引用,因此最终会得到一个空HashMaps的ArrayList。要么为输入中的每一行构造一个新的HashMap,要么使用以下构造函数创建一个HashMap的副本:HashMap<String,String> copy = new HashMap(newTags);。然后将副本添加到ArrayList。通过使用该构造函数,newTags中的所有值都被复制,并且不会对newTags保留任何引用,因此您可以使用newTag执行任何操作,例如清除它。