Como randomizar duas ArrayLists da mesma maneira?

Eu tenho dois filelist arraylist e imgList que se relacionam entre si, por exemplo, “H1.txt” relacionado a “e1.jpg”. Como randomizar automaticamente a lista de imgList acordo com a randomização de fileList ? Como no excel, se classificarmos certa coluna, a outra coluna seguirá automaticamente?

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

saída após a randomização, por exemplo:

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

saída pretendida:

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

Use Collections.shuffle() duas vezes, com dois objects Random inicializados com a mesma semente:

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

Usar dois objects Random com a mesma semente garante que ambas as listas sejam embaralhadas exatamente da mesma maneira. Isso permite duas collections separadas.

Envolva-os em outra class para que você possa acabar com uma única matriz ou List desses objects.

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

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

A abordagem mais simples é encapsular os dois valores juntos em um tipo que tenha a imagem e o arquivo. Em seguida, construa uma ArrayList e embaralhe-a.

Isso também melhora o encapsulamento, fornecendo a propriedade de que você sempre terá o mesmo número de arquivos que as imagens automaticamente.

Uma alternativa, se você realmente não gostar dessa idéia, seria escrever o código aleatoriamente (existem muitos exemplos de um shuffle Fisher-Yates modificado em Java, incluindo diversos sobre o Stack Overflow que suspeito) e apenas operar em ambas as listas em o mesmo tempo. Mas eu recomendo fortemente ir com a abordagem “melhorar o encapsulamento”.

Você poderia fazer isso com mapas:

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

Isto irá iterar através das imagens na ordem aleatória.

Isso pode ser feito usando o método shuffle:

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

Em vez de ter duas matrizes de Strings, tenha um array de uma class personalizada que contenha suas duas strings.

Você pode criar um array contendo os números de 0 a 5 e embaralhá-los. Em seguida, use o resultado como um mapeamento de “oldIndex -> newIndex” e aplique esse mapeamento aos dois arrays originais.

Não totalmente certo do que você quer dizer com “automaticamente” – você pode criar um object contêiner que contenha os dois objects:

public class FileImageHolder {String nome_do_arquivo; String nome da imagem; // TODO: insira o material aqui}

E, em seguida, coloque isso em uma lista de matriz e escolha aleatoriamente essa lista de matriz.

Caso contrário, você precisaria acompanhar onde cada elemento foi movido em uma lista e movê-lo para outro.

A menos que haja uma maneira de recuperar o índice antigo dos elementos depois que eles foram embaralhados, eu faria isso de duas maneiras:

A) Faça outra lista multi_shuffler = [0, 1, 2, …, file.size ()] e embaralhe-a. Faça um loop sobre ele para obter o pedido para suas listas de arquivos / imagens embaralhadas.

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

ou B) Crie uma class StringWrapper para manter os nomes de arquivo / imagem e combine as duas listas que você já tem em uma: ArrayList combinedList;