在java中解析字符串时出现outOfBoundException

时间:2013-10-10 13:12:41

标签: java

我在解析时面临一个问题, 我有一个字符串:String str="20|^64|^New Income - GROWTH|^10.0|^27-Dec-2011"

我想用分隔符“| ^”解析它。

我曾尝试过:

ArrayList<String> stocklist = IOUtil.parseResponse(str, "|^");

这里是parseResponse()方法:

public static ArrayList<String> parseResponse(String input, String delimeter) {
    ArrayList<String> parsed_strings = new ArrayList<String>();
    while (true) {
        int i = input.indexOf(delimeter);
        if (i >= 0) {
            String s = input.substring(0, i);
            parsed_strings.add(s.trim());
            input = input.substring(i + delimeter.length(), input.length());
        } else {
            break;
        }
    }
    if (parsed_strings.size() < 1) {
        parsed_strings.add(input);
    }
    return parsed_strings;
}

但我没有得到最后一个元素27-Dec-2011。我得到outOfBoundException为:java.lang.IndexOutOfBoundsException: Invalid index 4, size is 4 任何帮助将不胜感激。提前谢谢。

6 个答案:

答案 0 :(得分:1)

我觉得你正在接近这个问题,你想要一个由| ^分隔的字符串的ArrayList。我会这样做:

ArrayList<String> params = new ArrayList<String>(Arrays.asList(str.split("\\|\\^")));

答案 1 :(得分:1)

String []b = "20|^64|^New Income - GROWTH|^10.0|^27-Dec-2011".split("\\|\\^");
for (String a: b) {
   System.out.println(a);
}

打印:

20
64 
New Income - GROWTH
10.0
27-Dec-2011

您的日期字符串是b[4];

答案 2 :(得分:1)

您只是将子串添加到以|^结尾的数组中。如果你在字符串末尾添加一个|^,一切都会好的。或者更改代码,使其始终添加字符串的剩余部分(在最后一个分隔符后面)。像这样:

public static ArrayList<String> parseResponse(String input, String delimeter) {
    ArrayList<String> parsed_strings = new ArrayList<String>();
    int i = -1;
    while ((i = input.indexOf(delimeter)) >= 0) {
        String s = input.substring(0, i);
        parsed_strings.add(s.trim());
        input = input.substring(i + delimeter.length(), input.length());
    }
    parsed_strings.add(input);
    return parsed_strings;
}

但最好的方法是使用String split方法。

例如:

public static ArrayList<String> parseResponse(String input, String delimeter) {
    String quotedDelimiter = Pattern.quote(delimeter);
    String[] outputArray = input.split(quotedDelimiter);
    List<String> outputList = Arrays.asList(outputArray);
    return new ArrayList<String>(outputList);
}

看起来更干净。

答案 3 :(得分:0)

问题可能就在这里;

input = input.substring(i + delimeter.length(), input.length());

substring()

  

public String substring(int beginIndex,                  int endIndex)

     

返回一个新字符串,该字符串是此字符串的子字符串。子串   从指定的 beginIndex 开始,并延伸到at处的字符   index endIndex - 1 。因此子串的长度是   endIndex的-的beginIndex。

答案 4 :(得分:0)

我运行了你的代码而没有获得IndexOutOfBoundsException。相反,该方法返回数组[“20”,“64”,“新收入 - 增长”,“10.0”]。

要修复代码以包含最后一个元素,请更改此代码段:

if (parsed_strings.size() < 1) {
    parsed_strings.add(input);
}

到这个新片段:

parsed_strings.add(input);

答案 5 :(得分:0)

这是因为你停在2011年12月27日之前的最后一个索引。^ 您应该更改算法或在字符串

结尾处使用| ^