2010-08-10 4 views
2

J'essaie de copier certains éléments d'un tableau dans un autre. Par exemple, je veux copier l'index 0 des lignes dans l'index 0 des liens, l'index 3 des lignes dans l'index 1 des liens, et ainsi de suite (tous les 3 éléments de lignes essentiellement fondamentalement). Ce que j'ai jusqu'ici continue à me faire une erreur ArrayIndexOutOfBound. Merci de votre aide!question du débutant: copier certains éléments d'un tableau

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, Item 25: Préférez les listes à arrays_. – polygenelubricants

Répondre

4

Il semble que vous devez être incrémenter i par 3, plutôt que d'ajouter 3-j (mais incrémenter alors j par seulement 1). En fait, vous n'avez pas besoin de deux variables du tout:

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

Vous devez également modifier votre code pour ne créer que le tableau soit aussi grand que vous avez besoin:

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

juste pour le plaisir d'intérêt, nous allons jeter un oeil à ce que votre code est en fait essaie de faire, en termes de missions:

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

Comme vous pouvez le voir, c'est juste compensation l'indice, plutôt que de multiplier ... et dès que i était lines.length-3, vous finiriez avec

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

Quelques problèmes:

1. Vous voulez sans doute ceci:

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

Pour ressembler à ceci:

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

2. Eh bien, oui. Vous sortez des limites. Disons lines est 12 éléments. links est la même taille, de sorte que vous essayez de lire de l'élément 15/36 (en fonction de ma correction # 1)

La solution est de faire links plus petit:

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

Avec la correction en 1.

0

Jon Skeet a la bonne idée. Ce qui pourrait être utile est d'apprendre à déboguer ces choses soi-même. Dites que lines.length est 5, signifiant aussi que links.length est 5. Que se passe-t-il si vous tracez chaque itération de la boucle for?

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

Il va casser sur cette 3ème itération. Vous pouvez voir que vous n'accédez pas du tout à tous les trois éléments, mais à tous les éléments, et que vous les stockez dans une position décalée, ce qui provoque l'exception de votre index hors limites.