2010-08-10 3 views
2

Я пытаюсь скопировать некоторые элементы массива в другой. Например, я хочу скопировать индекс 0 строк в индекс 0 ссылок, индекс 3 строк в индекс 1 ссылок и т. Д. (Каждый 3 элемента строк в основном в основном).вопрос начинающего: копирование определенных элементов массива

То, что я до сих пор продолжает получать ошибку ArrayIndexOutOfBound. Спасибо за помощь!

String[] lines = inputString.split(System.getProperty("line.separator")); 
String[] links = new String[lines.length]; 
int j = 0; 

for (int i = 0; i < lines.length; i++) { 
    links[i] = lines[j+3]; 
    j++; 
    System.out.println(links[i]); 
} 
+1

Aiyiyi. _Effective Java 2nd Edition, пункт 25: Предпочтительные списки для массивов_. – polygenelubricants

ответ

4

Похоже, вы должны быть увеличивающиеся i на 3, а не добавление 3 к j (но затем увеличивающиеся j всего на 1). На самом деле, вам не нужны две переменные вообще:

for (int i = 0; i < lines.length; i += 3) { 
    links[i/3] = lines[i]; 
} 

Вы также должны изменить свой код, чтобы только создать массив будет столь же большим, как вам нужно:

String[] links = new String[lines.length/3]; 

Просто ради интерес, давайте посмотрим на то, что ваш код был на самом деле пытается сделать, с точки зрения заданий:

links[0] = lines[3]; 
links[1] = lines[4]; 
links[2] = lines[5]; 
// etc 

Как вы можете видеть, это просто компенсируя индекс, а не умножая его ... и как только i был lines.length-3, вы бы в конечном итоге с

links[lines.length - 3] = lines[lines.length]; // Bang! 
0

Несколько проблем:

1. Вы, наверное, хотите:

for (int i = 0; i < lines.length; i++) { 
    links[i] = lines[j+3]; 

Чтобы выглядеть следующим образом:

for (int i = 0; i < links.length; i++) { 
    links[i] = lines[j * 3]; 

2. Ну, да. Вы выходите за пределы. Скажем, lines - 12 элементов. links имеет тот же размер, так что вы пытаетесь прочитать от элемента 15/36 (в зависимости от моей коррекции # 1)

Решение состоит в том, чтобы сделать links меньше:

String[] links = new String[(int)(lines.length/3)]; 

Наряду с коррекцией в 1.

0

Jon Skeet имеет правильную идею. Что может быть полезно, так это научиться самостоятельно отлаживать эти вещи. Скажем, что lines.length равно 5, что также означает, что links.length - 5. Что произойдет, если вы проследите каждую итерацию цикла for?

i  |  j  |  j + 3  
----------------------------------------- 
0    0    3  
1    1    4 
2    2    5 

Это трещина на этой третьей итерации. Вы можете видеть, что вы не имеете доступа ко всем трем элементам, но каждый элемент, и вы храните его в позиции смещения, что приводит к исключению вашего индекса из пределов.

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