如何以相同的方式随机化两个数组列表?

我有两个相互关联的数组列表filelistimgList。“H1.txt”与“e1.jpg”相关。如何根据fileList的随机化自动随机化imgList的列表?就像在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"};
202628 次浏览

将它们包装在另一个类中,这样你就可以得到这些对象的单个数组或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);

最简单的方法是将这两个值封装到一个同时包含图像和文件的类型中。然后构建ArrayList并洗牌它。

这也改进了封装,为您提供了这样一种属性,即您总是自动拥有与图像相同数量的文件。

如果你真的不喜欢这个想法,另一个选择是自己编写shuffle代码(在Java中有很多修改的Fisher-Yates洗牌的例子,包括Stack Overflow上的几个我怀疑),并同时操作两个列表。但是我强烈建议使用“改进封装”方法。

不是有两个字符串数组,而是有一个自定义类数组,其中包含两个字符串。

你可以在地图上这样做:

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

这将以随机顺序遍历图像。

您可以创建一个包含数字0到5的数组,并对其进行洗牌。然后使用结果作为“oldIndex -> newIndex”的映射,并将此映射应用于两个原始数组。

使用Collections.shuffle()两次,使用相同的种子初始化两个Random对象:

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

使用具有相同种子的两个Random对象可以确保两个列表将以完全相同的方式进行洗牌。这允许两个独立的集合。

不完全确定你所说的“自动”是什么意思-你可以创建一个容器对象来容纳这两个对象:

公共类FileImageHolder { 字符串文件名; 字符串imageName; //TODO:在这里插入东西 } < / p >

然后把它放到一个数组列表中随机化这个数组列表。

否则,您将需要跟踪每个元素在一个列表中的移动位置,并将其移动到另一个列表中。

除非有一种方法可以在元素被打乱后检索旧的索引,否则我会用两种方法之一:

< p >) 创建另一个列表multi_shuffler =[0,1,2,…]., file.size()],然后进行洗牌。循环它以获得打乱的文件/图像列表的顺序

ArrayList newFileList = new ArrayList(); ArrayList newImgList = new ArrayList(); For (i=0;我 < p >或B) 创建一个StringWrapper类来保存文件/图像名称,并将两个列表合并为一个:ArrayList combinedList

这可以使用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;