Как рандомизировать два 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;