繁体   English   中英

用空格分隔的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循环中标识空白。 尽管第一个for-each循环按预期工作,但在第二个循环中,String拆分不起作用。 我尝试使用正则表达式“”,“ \\\\ s +”和“ \\\\ s”,以及Apache Commons StringUtils拆分方法,但未能产生所需的输出。

有一个StringIndexOutOfBounds异常,控制台输出如下所示-

AttrVal: Tag="12110000" TaxName="ICMS" TaxRate="25.00" TaxAmount="24.75"

我要去哪里错了?

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

  1. 您确实应该使用Biffen建议的XML解析器。 它使生活变得更加轻松,并避免了错误。
  2. 第二个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()函数自动删除字符串开头和结尾的空格字符。
  3. 您将您的HashMap添加到ArrayList,然后清除HashMap。 由于ArrayList保留了对地图的引用,因此最终将得到一个空HashMaps的ArrayList。 为输入中的每一行构造一个新的HashMap,或者使用以下构造函数创建您拥有的HashMap的副本: HashMap<String,String> copy = new HashMap(newTags); 然后将副本添加到ArrayList。 通过使用该构造函数,将复制newTags中的所有值,并且不保留对newTags的引用,因此您可以使用newTags进行所需的任何操作,例如清除它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM