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;
}
Author: Serban Cosmin, 2015-01-10

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 7s, suivant 8s et enfin 9s.

, 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;
 1
Author: Willem Van Onsem, 2017-05-23 11:50:56

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.

 1
Author: shauryachats, 2015-01-10 12:19:31

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);
 1
Author: Daniel Persson, 2015-01-10 22:30:53

Essayez ceci:

int j=0;
int i=idx+1;
while (j<t.length) {
    t[j] = s[i];
    j++;
    i++;
}
 0
Author: vls1, 2015-01-10 12:20:12