268 votes

Comment randomiser deux ArrayLists de la même manière ?

J'ai deux listes de tableaux filelist y imgList qui sont liés les uns aux autres, par exemple "H1.txt" lié à "e1.jpg". Comment randomiser automatiquement la liste des imgList selon la randomisation de fileList ? Comme dans Excel, si nous trions une certaine colonne, l'autre colonne suivra automatiquement ?

String [] file = {"H1.txt","H2.txt","H3.txt","M4.txt","M5.txt","M6.txt"};
ArrayList<String> fileList = new ArrayList<String>(Arrays.asList(file));

String [] img = {"e1.jpg","e2.jpg","e3.jpg","e4.jpg","e5.jpg","e6.jpg"};
ArrayList<String> imgList = new ArrayList<String>(Arrays.asList(img));

//randomized files
Collections.shuffle(fileList);

sortie après randomisation, par exemple :

fileList = {"M4.txt","M6.txt","H3.txt","M5.txt","H2.txt","H1.txt"};

le résultat escompté :

 imgList = {"e4.jpg","e6.jpg","e3.jpg","e5.jpg","e2.jpg","e1.jpg"};

599voto

Michael Borgwardt Points 181658

Utilisez Collections.shuffle() deux fois, avec deux Random initialisés avec la même graine :

long seed = System.nanoTime();
Collections.shuffle(fileList, new Random(seed));
Collections.shuffle(imgList, new Random(seed));

En utilisant deux Random avec la même graine garantit que les deux listes seront mélangées exactement de la même manière. Cela permet d'avoir deux collections distinctes.

123voto

BalusC Points 498232

Enveloppez-les dans une autre classe afin de vous retrouver avec un seul tableau ou List de ces objets.

public class Data {
    private String txtFileName;
    private String imgFileName;

    // Add/generate c'tor, getter/setter, equals, hashCode and other boilerplate.
}

Exemple d'utilisation :

List<Data> list = new ArrayList<Data>();
list.add(new Data("H1.txt", "e1.jpg"));
list.add(new Data("H2.txt", "e2.jpg"));
// ...

Collections.shuffle(list);

10 votes

C'est la solution Java, orientée objet. Peut-être, comment cela devrait être fait... :)

22voto

Jon Skeet Points 692016

L'approche la plus simple consiste à encapsuler les deux valeurs dans un type qui contient à la fois l'image et le fichier. Ensuite, il faut construire un ArrayList de que et le mélanger.

Cela améliore également l'encapsulation, en vous donnant la propriété de toujours avoir le même nombre de fichiers que d'images automatiquement.

Une alternative si vous vraiment Si vous n'aimez pas cette idée, vous pouvez écrire le code de brassage vous-même (il existe de nombreux exemples de code de brassage modifié). Le remaniement Fisher-Yates en Java, dont plusieurs sur Stack Overflow, je suppose) et opérer sur les deux listes en même temps. Mais je vous recommande vivement d'adopter l'approche "améliorer l'encapsulation".

11voto

jjnguy Points 62123

Vous pourriez le faire avec des cartes :

Map<String, String> fileToImg:
List<String> fileList = new ArrayList(fileToImg.keySet());
Collections.shuffle(fileList);
for(String item: fileList) {
    fileToImf.get(item);
}

Ceci va itérer à travers les images dans un ordre aléatoire.

4voto

EboMike Points 39257

Au lieu d'avoir deux tableaux de chaînes de caractères, ayez un tableau d'une classe personnalisée qui contient vos deux chaînes de caractères.

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