metodos example español java list collections arraylist

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



java list object example (9)

Tengo dos listas de archivos de filelist e imgList que se relacionan entre sí, por ejemplo, "H1.txt" relacionado con "e1.jpg". ¿Cómo aleatorizar automáticamente la lista de imgList acuerdo con la aleatorización de fileList ? Como en Excel, si ordenamos cierta columna, ¿la otra columna seguirá automáticamente?

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);

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

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

salida prevista:

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


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

A) Haz otra lista multi_shuffler = [0, 1, 2, ..., file.size ()] y barajala. Pase por encima para obtener el orden de sus listas de archivos / imágenes barajadas.

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

o B) Cree una clase StringWrapper para guardar los nombres de archivo / imagen y combine las dos listas que ya tiene en una: ArrayList combinedList;


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

Eso también mejora la encapsulación, dándole la propiedad de que siempre tendrá el mismo número de archivos que las imágenes automáticamente.

Una alternativa si realmente no te gusta esa idea sería escribir tú mismo el código de reproducción aleatoria (hay muchos ejemplos de una reproducción aleatoria de Fisher-Yates modificada en Java, incluyendo varias en el Desbordamiento de pila que sospecho) y simplemente operar en ambas listas en al mismo tiempo. Pero recomiendo encarecidamente ir con el enfoque de "mejorar la encapsulación".


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


Envuélvalos en otra clase para que pueda terminar con una sola 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<Data> list = new ArrayList<Data>(); list.add(new Data("H1.txt", "e1.jpg")); list.add(new Data("H2.txt", "e2.jpg")); // ... Collections.shuffle(list);


Esto se puede hacer usando el método shuffle:

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


No está 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: insertar cosas aquí}

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

De lo contrario, deberá realizar un seguimiento de dónde se movió cada elemento en una lista y moverlo también en la otra.


Podrías hacer esto con mapas:

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

Esto recorrerá las imágenes en orden aleatorio.


Puede crear una matriz que contenga los números del 0 al 5 y mezclarlos. Luego use el resultado como una asignación de "oldIndex -> newIndex" y aplique esta asignación a sus matrices originales.


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 garantiza que ambas listas se barajen exactamente de la misma manera. Esto permite dos colecciones separadas.