Jak randomizować dwie Arraylistki w ten sam sposób?

Mam dwie arraylist filelist i imgList, które są ze sobą powiązane, np. " H1.txt "związane z" e1.jpg". Jak automatycznie randomizować listę imgList zgodnie z randomizacją fileList? Podobnie jak w Excelu, jeśli posortujemy określoną kolumnę, Druga kolumna automatycznie nastąpi?

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

Wyjście po randomizacji np.:

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

Zamierzone wyjście:

 imgList = {"e4.jpg","e6.jpg","e3.jpg","e5.jpg","e2.jpg","e1.jpg"};
Author: regapictures, 2010-11-19

9 answers

Użycie Collections.shuffle() dwa razy, z dwoma obiektami Random zainicjalizowanymi tym samym nasieniem:

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

Użycie dwóch obiektów Random z tym samym nasieniem zapewnia, że obie listy będą tasowane w dokładnie taki sam sposób. Pozwala to na dwa oddzielne zbiory.

 569
Author: Michael Borgwardt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-04 20:08:00

Zawiń je w inną klasę, aby można było skończyć z pojedynczą tablicą lub List tych obiektów.

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

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

Przykład użycia:

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);
 119
Author: BalusC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-19 20:13:20

Najprostszym podejściem jest zamknięcie dwóch wartości razem w typ, który ma zarówno obraz, jak i plik. Następnie zbuduj ArrayList z , że i przetasuj go.

To również poprawia enkapsulację, dając Ci właściwość, że zawsze będziesz mieć taką samą liczbę plików jak obrazy automatycznie.

Alternatywą, jeśli naprawdę nie podoba Ci się ten pomysł, byłoby samodzielne napisanie kodu shuffle (jest wiele przykładów zmodyfikowanego Fisher-Yates shuffle w Javie, w tym kilka Na Stack Overflow podejrzewam) i po prostu działają na obu listach jednocześnie. Ale zdecydowanie polecam podejście "improve encapsulation".

 22
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-19 20:13:27

Można to zrobić z mapami:

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

Będzie to powtarzane przez obrazy w losowej kolejności.

 9
Author: jjnguy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-19 20:14:07

Można to zrobić za pomocą metody 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;
 5
Author: Rohit Goyal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-23 16:59:19

Zamiast mieć dwie tablice łańcuchów, miej jedną tablicę niestandardowej klasy, która zawiera Twoje dwa łańcuchy.

 4
Author: EboMike,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-19 20:14:05

Możesz utworzyć tablicę zawierającą liczby od 0 do 5 i przetasować je. Następnie użyj wyniku jako mapowania "oldIndex - > newIndex" i zastosuj to mapowanie do obu oryginalnych tablic.

 3
Author: Mark Byers,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-19 20:14:13

Nie do końca wiem, co rozumiesz przez "automatycznie" - możesz utworzyć obiekt kontenera, który przechowuje oba obiekty:

Public class FileImageHolder { String fileName; String imageName; // TODO: Wstaw tu coś }

A następnie umieść ją na liście tablic i Losuj ją.

W przeciwnym razie, trzeba by śledzić, gdzie każdy element przeniósł się w jednej liście, i przenieść go w drugiej, jak również.

 2
Author: aperkins,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-19 20:15:15

O ile nie ma sposobu na odzyskanie starego indeksu elementów po przetasowaniu, zrobiłbym to na dwa sposoby:

A) Make another list multi_shuffler = [0, 1, 2, ... , plik.size ()] i przetasuj. Zapętl go, aby uzyskać kolejność tasowanych list plików/obrazów.

ArrayList newFileList = new ArrayList(); ArrayList newImgList = Nowa ArrayList(); for (i=0; i

Lub B) Utwórz klasę StringWrapper do przechowywania nazw plików/obrazów i połącz dwie listy masz już w jednym: ArrayList combinedList;

 2
Author: ajwood,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-19 20:24:27