Как рандомизировать два ArrayLists таким же образом?

У меня есть два arraylist filelist и imgList, которые связаны друг с другом, например. "H1.txt", относящаяся к "e1.jpg". Как автоматически рандомизировать список imgList в соответствии с рандомизацией filelist? Как и в excel, если мы отсортируем определенный столбец, следующий столбец будет автоматически следовать?

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

после рандомизации, например:

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

предполагаемый выход:

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

Ответ 1

Используйте Collections.shuffle() дважды, с двумя объектами Random, инициализированными одним и тем же семенем:

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

Использование двух объектов Random с одним и тем же семенем гарантирует, что оба списка будут перетасовываться точно так же. Это позволяет создавать две отдельные коллекции.

Ответ 2

Оберните их в другой класс, чтобы вы могли получить один массив или List этих объектов.

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

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

Пример использования:

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

Ответ 3

Самый простой подход - объединить два значения вместе в тип, который имеет как изображение, так и файл. Затем создайте ArrayList и перетасуйте его.

Это также улучшает инкапсуляцию, предоставляя вам свойство, что вы всегда будете иметь такое же количество файлов, что и изображения автоматически.

Альтернатива, если вам действительно не нравится эта идея, заключалась бы в том, чтобы написать код тасования самостоятельно (есть много примеров измененного Fisher-Yates shuffle на Java, в том числе несколько из Stack Overflow, которые я подозреваю) и просто работают с обоими списками одновременно. Но я настоятельно рекомендую использовать подход "улучшить инкапсуляцию".

Ответ 4

Вы можете сделать это с помощью карт:

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

Это будет проходить через изображения в случайном порядке.

Ответ 5

Это можно сделать с помощью метода тасования:

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

Ответ 6

Вместо того, чтобы иметь два массива строк, используйте один массив пользовательского класса, который содержит две строки.

Ответ 7

Вы можете создать массив, содержащий числа от 0 до 5, и перетасовать их. Затем используйте результат как отображение "oldIndex → newIndex" и примените это сопоставление к вашим исходным массивам.

Ответ 8

Не совсем уверен, что вы подразумеваете под "автоматически" - вы можете создать контейнерный объект, который содержит оба объекта:

открытый класс FileImageHolder {   String fileName;   String imageName;   //TODO: вставить материал здесь }

И затем поместите это в список массивов и рандомизируйте этот список массивов.

В противном случае вам нужно будет отслеживать, где каждый элемент перемещается в один список, а также перемещать его в другом.

Ответ 9

Если нет способа получить старый индекс элементов после их перетасовки, я бы сделал это одним из двух способов:

А)  Сделайте еще один список multi_shuffler = [0, 1, 2,..., file.size()] и перетасуйте его. Переверните его, чтобы получить заказ на ваши перетасованные файлы/списки изображений.

ArrayList newFileList = new ArrayList(); ArrayList newImgList = новый ArrayList(); для (i = 0; i

или B)  Создайте класс StringWrapper для хранения имен файлов и изображений и объедините два списка, которые у вас уже есть: ArrayList combinedList;