¿Cómo aleatorizar dos ArrayLists de la misma manera?

Tengo dos lista de filelist listas de filelist y listas de filelist imgList que se relacionan entre sí, por ejemplo, “H1.txt” relacionado con “e1.jpg”. ¿Cómo se aleatorizó automáticamente la lista de imgList según la aleatorización de fileList ? Al igual que en Excel, si clasificamos cierta columna, ¿la otra columna seguirá automáticamente?

 String [] file = {"H1.txt","H2.txt","H3.txt","M4.txt","M5.txt","M6.txt"}; ArrayList fileList = new ArrayList(Arrays.asList(file)); String [] img = {"e1.jpg","e2.jpg","e3.jpg","e4.jpg","e5.jpg","e6.jpg"}; ArrayList imgList = new ArrayList(Arrays.asList(img)); //randomized files Collections.shuffle(fileList); 

salida después de la aleatorización, por ejemplo:

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

producción prevista:

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

Use Collections.shuffle() dos veces, con dos objetos Random inicializados con la misma semilla:

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

El uso de dos objetos Random con la misma semilla asegura que ambas listas se mezclarán exactamente de la misma manera. Esto permite dos colecciones separadas.

Envuélvalos en otra clase para que pueda terminar con una única matriz o List de esos objetos.

 public class Data { private String txtFileName; private String imgFileName; // Add/generate c'tor, getter/setter, equals, hashCode and other boilerplate. } 

Ejemplo de uso:

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

El enfoque más simple es encapsular los dos valores en un tipo que tenga tanto la imagen como el archivo. Luego construye una ArrayList de eso y baraja.

Eso también mejora la encapsulación, proporcionándole la propiedad de que siempre tendrá la misma cantidad de archivos que las imágenes automáticamente.

Una alternativa si realmente no te gusta esa idea sería escribir el código de mezcla por tu cuenta (hay muchos ejemplos de una mezcla de Fisher-Yates modificada en Java, incluidos varios en Desbordamiento de stack, sospecho) y simplemente operar en ambas listas en al mismo tiempo. Pero recomiendo ir con el enfoque de “mejorar la encapsulación”.

Puedes hacer esto con mapas:

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

Esto se repetirá a través de las imágenes en orden aleatorio.

Esto se puede hacer usando el método aleatorio:

 private List getJumbledList() { List myArrayList2 = new ArrayList(); myArrayList2.add(8); myArrayList2.add(4); myArrayList2.add(9); Collections.shuffle(myArrayList2); return myArrayList2; 

En lugar de tener dos matrices de cadenas, tenga una matriz de una clase personalizada que contenga sus dos cadenas.

Puede crear una matriz que contenga los números 0 a 5 y mezclarlos. A continuación, utilice el resultado como una asignación de “oldIndex -> newIndex” y aplique esta asignación a sus dos matrices originales.

No estoy totalmente seguro de lo que quiere decir con “automáticamente”: puede crear un objeto contenedor que contenga ambos objetos:

clase pública FileImageHolder {String fileName; String imageName; // TODO: inserta cosas aquí}

Y luego poner eso en una lista de matriz y aleatorizar esa lista de matriz.

De lo contrario, necesitaría hacer un seguimiento de dónde se movía cada elemento en una lista, y moverlo en la otra también.

A menos que haya una manera de recuperar el índice anterior de los elementos después de que hayan sido mezclados, lo haría de dos maneras:

A) Haz otra lista multi_shuffler = [0, 1, 2, …, file.size ()] y baraja. Haz un bucle para obtener el orden de las listas de archivos / imágenes mezcladas.

ArrayList newFileList = new ArrayList (); ArrayList newImgList = new ArrayList (); para (i = 0; i

o B) Cree una clase StringWrapper para contener los nombres de archivos / imágenes y combine las dos listas que ya tiene en una: ArrayList combinedList;