Indexation dans les tableaux java
J'ai dû écrire une méthode en Java, où avoir en entrée un tableau a
de nombres et un nombre x
renvoie un tableau d'éléments qui suit la dernière occurrence de x
dans a
.
, Par exemple, avec entrée {0,1,2,3,4,5,6,7,8,9}
et x=6
la méthode doit retourner {7,8,9}
pendant ce temps avec {4,1,4,2}
et x=4
la méthode doit retourner {2}
et si la x
n'est pas a
, ensuite, il faut revenir à vide matrice {}
(ou un tableau avec des 0 longueur)
J'ai donc eu cette réponse:
int idx = -1;
for (int i = 0; i < s.length; i++) {
if (s[i] == x)
idx = i;
}
/* After you found this index, create a new array starting
* from this element. It can be done with a second (not nested) for loop, or you can
* use Arrays.copyOfRange()
*/
//make sure idx != -1
int[] t = new int[s.length - idx - 1];
for (int i = idx + 1; i < s.length; i++)
t[i - idx - 1] = s[i];
Qui était très utile mais je ne pouvais pas comprendre pourquoi cela fonctionne: (ÉDITÉ; Ok maintenant je comprends pourquoi cela fonctionne mais même si à mon avis le combiné pour la boucle ideea était plus moins compliqué à lire)
t[i - idx - 1] = s[i];
Et ce n'est pas le cas:
int[] t = new int[a.length - indx - 1];
for (int j = indx + 1; j < a.length; j++) {
for (int i = 0; i < t.length; i++) {
t[i]=a[j];
}
}
return t;
ÉDITÉ : Pour clarifier ceci est tout le code
int[] dopoX(int[] a, int x) {
int n = a.length;
int[] c = new int[0];
int indx = 0;
int nrx = 0;
for (int j = 0; j < a.length; j++) {
if (a[j] == x)
nrx++;
if (a[j] == x)
indx=j;
}
if (nrx == 0)
return c;
int[] t = new int[n - indx - 1];
for (int j = indx + 1; j < n; j++) {
for (int i = 0; i < t.length; i++) {
t[i] = a[j]; /* it returns just 1 number of a[] like t{2,2,2,2,2,2,2,2} which is
not correct */
}
}
return t;
}
4 answers
Eh bien, vous voulez copier toutes les valeurs restantes et créer un tableau d'index t
. Vous devez donc commencer par i=0
. Vous pouvez cependant effectuer un shift-opération: augmentation de i
, quelque part, et quand vous l'utilisez, le basculer en arrière, donc:
for (int i = idx+1; i < s.length; i++)
t[i-idx-1] = s[i];
Est égal à:
for (int i = 0; i < t.length; i++)
t[i] = s[i+idx+1];
(ce qui aurait également été plus lisible)
À Propos de votre deuxième question:
Ici, vous utilisez un boucle imbriquée: la seconde for
boucle sera répétée à chaque itération de la première.
Le résultat est donc que dans la seconde for
, en boucle j
est toujours fixe, avec entrée {1,2,...,9}
et 6
dans la première itération, vous remplissez votre tableau avec 7
s, suivant 8
s et enfin 9
s.
, Vous pouvez toutefois utiliser un combiné for
boucle:
int []t=new int[n-indx-1];
// /-- grouped initializers /-- grouped increments
// | |
for(int i=0, j= indx+1; i < t.length; i++, j++){
t[i]=a[j];
}
return t;
Supposons que vous prenez le cas où a[] = {1,2,3,4,5,6,7,8,9}
et x = 6
.
Exécuter ceci:
int idx = -1;
for (int i = 0; i < s.length; i++) {
if (s[i] == x) idx = i;
}
Vous avez idx = 5
comme s[5] == x
.
Maintenant, nous voulons copier le tableau, après la dernière occurrence de x
dans une nouvelle matrice t[]
.
Évidemment, vous devez partir de l'index idx + 1
car idx
contenait la dernière occurrence de x
.
Par conséquent, ce code:
int[] t = new int[s.length - idx - 1];
for (int i = idx+1; i < s.length; i++)
t[i-idx-1] = s[i];
Que faites-vous ici?
Vous construisez un nouveau tableau t[]
ayant une longueur s.length - idx - 1
, dans notre cas s.length = 9
et idx = 5
donc, nous avons le s.length - idx - 1
, comme 3
et on peut vérifier que c'est le nombre d'éléments à partir de x = 6
.
Maintenant, nous commençons l'itérateur i
de idx + 1
(Raison expliquée ci-dessus) à s.length
Nous avons t[i - idx - 1]
parce que quand i = idx + 1
, i - idx - 1 = 0
. Donc comme i
augmente, votre i - idx - 1
augmente également.
J'espère que c'était convaincant. Veuillez commenter si vous avez encore des doutes.
La première ligne de code trouve le dernier index de x à l'intérieur du tableau.
La deuxième ligne utilise la fonction intégrée des tableaux pour copier une plage d'un tableau vers une nouvelle copie.
Et nous copions à partir des valeurs après le dernier x jusqu'à la longueur du tableau a.
La première ligne pourrait être réécrite pour rechercher à partir de la fin et vers l'arrière dans le tableau avec une pause. Cela donnera un coup de pouce aux performances, mais rend le code moins facile à lire.
for(int i=0; i<a.length;i++) if(a[i]==x) idx=i;
int[] b = Arrays.copyRangeTo(a, idx+1, a.length);
Essayez ceci:
int j=0;
int i=idx+1;
while (j<t.length) {
t[j] = s[i];
j++;
i++;
}