2013-10-10 3 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. Но я хочу, чтобы последний элемент также «27-Dec-2011», как я это получу. – 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()

общественной Строка подстрока (интермедиат beginIndex, INT ENDINDEX)

Возвращает новую строку, которая является подстрокой данной строки. Подстрока начинается с заданного beginIndex и продолжается до символа индекс endIndex - 1. Таким образом, длина подстроки равна endIndex-beginIndex.

0

Я провел ваш код и не получил IndexOutOfBoundsException. Вместо этого метод возвращает массив ["20", "64", "Новый доход - РОСТ", "10.0"].

Чтобы исправить код, чтобы включить последний элемент, изменить этот фрагмент:

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

в новом фрагменте кода:

parsed_strings.add(input); 
+0

Btw, «delimeter» пишется «разделитель». – Nayuki

0

это потому, что вы останавливаетесь в последний индекс |^который до 27-дек-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); 
} 

Он выглядит намного чище.

Смежные вопросы