2013-10-10 57 views
0

解析字符串,我面臨一個解析問題, 我有一個字符串爲:String str="20|^64|^New Income - GROWTH|^10.0|^27-Dec-2011"outOfBoundException而在Java

我想用分隔符來解析這個「| ^」。

我試過它:

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 任何幫助將不勝感激。提前致謝。

+4

如果大小爲4,則索引爲0到3. – Maroun

+0

@MarounMaroun。但我想要的最後一個元素也是「2011年12月27日」,我將如何得到它。 – PPD

+0

是否要用| ^分隔符分割字符串? –

回答

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];

0

問題可能在這裏;

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

substring()

公共字符串的子串(INT的beginIndex, INT endIndex的)

返回一個新字符串,它是此字符串的一個子。子字符串 從指定的beginIndex開始,並擴展到 索引的字符endIndex - 1。因此子字符串的長度是 endIndex-beginIndex。

0

我跑你的代碼,並沒有得到IndexOutOfBoundsException。相反,該方法返回數組[「20」,「64」,「New Income - GROWTH」,「10.0」]。

要解決你的代碼,包括最後一個元素,改變這個片斷:

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

這個新的代碼片段:

parsed_strings.add(input); 
+0

順便說一句,「delimeter」拼寫爲「delimiter」。 – Nayuki

0

這是因爲你停止的最後指數| ^其中是之前27-Dec-2011 你應該改變算法或者在字符串末尾有|^

1

我覺得你正在接近這個問題錯了,你想要一個ArrayList o f由| ^分隔的字符串。我只是這樣做:

ArrayList<String> params = new ArrayList<String>(Arrays.asList(str.split("\\|\\^"))); 
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); 
} 

它看起來乾淨多了。