Marrant comme problème J'ai fait ça en java, en n'utilisant qu'un tableau :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
String[] tableau = {"a", "b", "c", "d", "e", "f", "g"};
int[] indexACouper = {3, 5, 6};
String[] valIndexACouper = {"d", "f", "g"};
int indexColler = 2;
int decalage = 0;
for(int i = 0;i<indexACouper.length;i++) {
if(indexACouper[i]<indexColler) {
for(int j=indexACouper[i]-decalage;j<indexColler-1; j++) {
tableau[j]=tableau[j+1];
}
decalage++;
}
else {
for(int j=indexACouper[i];j>indexColler; j--) {
tableau[j]=tableau[j-1];
}
indexColler++;
}
}
for(int i = 0; i<indexACouper.length;i++) {
tableau[indexColler-(indexACouper.length-i)] = valIndexACouper[i];
} |
La première boucle sert à préparer le tableau en faisant des décalages. En effet, si l'index de la ligne qu'on coupe est < à indexColler, cela veut dire qu'on a juste à décaler vers indexColler en écrasant la valeur de la ligne que l'on coupe (on garde sa valeur en mémoire dans valIndexACouper.
Si par contre l'index de la ligne est > à indexColler, on doit tout décaler vers la droite entre indexColler et l'index de la ligne à couper, sans toucher à ce qu'on a après (et mettre à jour indexColler qui bouge). Exemple :
{"a", "b", "c", "d", "e", "f", "g"};
On veut que la case 1 (valeur b) aille au dessus de d, cela donnera :
{"a", "c", "c", "d", "e", "f", "g"};
La case d'indice 2 (valeur c) au dessus du d sera la case ou devra se trouver la valeur b.
Toujours sur ce tableau : {"a", "b", "c", "d", "e", "f", "g"};
On veut que la case 5 aille au dessus de d (indice 3), cela donnera :
{"a", "b", "c", "d", "d", "e", "g"};
La case d'indice 3 (valeur d) sera la case qui contiendra la valeur f. Ici, on voit que indexColler a été incrémenté à cause du décalage.
En faisant ça pour chaque case à mettre au dessus d'une autre, on obtient donc un tableau "dans le bon ordre", et il ne reste plus qu'à mettre à jour les cases au dessus de indexColler. C'est ce que fait la boucle finale.
Mon explication est peut être pas très claire, mais ça a l'air de marcher (j'ai fait ça assez rapidement donc pas testé tous les cas possibles). Au pire ça te donnera une idée
Résultats, toujours avec le même tableau de base {"a", "b", "c", "d", "e", "f", "g"} :
1 2 3
| int[] indexACouper = {0, 1, 3};
String[] valIndexACouper = {"a", "b", "d"};
int indexColler = 4; |
=> {c, a, b, d, e, f, g}
1 2 3
| int[] indexACouper = {1, 3, 5};
String[] valIndexACouper = {"b", "d", "f"};
int indexColler = 4; |
=> {a, c, b, d, f, e, g}
1 2 3
| int[] indexACouper = {3, 5, 6};
String[] valIndexACouper = {"d", "f", "g"};
int indexColler = 2; |
=> {a, b, d, f, g, c, e}
Les résultats sont corrects, si j'ai bien compris ce que tu voulais faire. Après, peut être qu'il existe un algo plus simple :p
Partager