64 votes

Java, déplacement d'éléments dans un tableau

J'ai un tableau d'objets en Java et j'essaie de tirer un élément vers le haut et de déplacer le reste d'un élément vers le bas.

Supposons que j'ai un tableau de taille 10 et que j'essaie de tirer le cinquième élément. Le cinquième élément passe en position 0 et tous les éléments de 0 à 5 seront décalés d'une unité.

Cet algorithme ne décale pas correctement les éléments :

 Object temp = pool[position];

for (int i = 0; i < position; i++) {                
    array[i+1] = array[i];
}
array[0] = temp;

Comment le faire correctement ?

102voto

Howard Points 23487

Logiquement cela ne fonctionne pas et vous devez inverser votre boucle :

 for (int i = position-1; i >= 0; i--) {                
    array[i+1] = array[i];
}

Alternativement, vous pouvez utiliser

 System.arraycopy(array, 0, array, 1, position);

32voto

Komal Padia Points 1386

En supposant que votre tableau est {10,20,30,40,50,60,70,80,90,100}

Ce que fait ta boucle c'est :

Itération 1 : tableau[1] = tableau[0] ; {10,10,30,40,50,60,70,80,90,100}

Itération 2 : tableau[2] = tableau[1] ; {10,10,10,40,50,60,70,80,90,100}

Ce que vous devriez faire, c'est

 Object temp = pool[position];

for (int i = (position - 1); i >= 0; i--) {                
    array[i+1] = array[i];
}

array[0] = temp;

29voto

Murat Mustafin Points 831

Vous pouvez simplement utiliser Collections.rotate(List<?> list, int distance)

Utilisez Arrays.asList(array) pour convertir en List

plus d'informations sur : https://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#rotate(java.util.List,%20int)

5voto

Ben Points 681

Juste pour être complet : Stream solution depuis Java 8.

 final String[] shiftedArray = Arrays.stream(array)
        .skip(1)
        .toArray(String[]::new);

Je pense que je suis resté avec le System.arraycopy() dans votre situation. Mais la meilleure solution à long terme pourrait être de tout convertir en collections immuables ( Guava , Vavr ), tant que ces collections sont de courte durée.

2voto

Paul Sasik Points 37766

Comme vous l'avez découvert, la manipulation des tableaux de cette manière est sujette aux erreurs. Une meilleure option peut être d'utiliser une LinkedList dans votre situation. Avec une liste chaînée et toutes les collections Java, la gestion des tableaux est gérée en interne, vous n'avez donc pas à vous soucier de déplacer des éléments. Avec une LinkedList, vous appelez simplement remove puis addLast et le tour est joué.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X