如何以同样的方式随机化两个ArrayList?

我有两个相关的imgList filelistimgList ,例如与“e1.jpg”相关的“H1.txt”。 如何根据fileList的随机化自动随机化imgList的列表? 像在Excel中一样,如果我们对某个列进行sorting,另一列将自动跟随?

 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"}; 

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

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

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

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

最简单的方法是将两个值一起封装成既有图像又有文件的types。 然后build立一个ArrayList并洗牌。

这也改善了封装,给你的财产,你将永远有自动与图像相同数量的文件。

如果你真的不喜欢这个想法,另一种方法是自己编写shuffle代码(在Java中有很多改进的Fisher-Yates shuffle的例子,包括我怀疑的Stack Overflow中的几个例子),并且只是在同一时间。 但我强烈build议采用“改进封装”方法。

你可以用地图来做到这一点:

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

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

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

而不是有两个string数组,有一个自定义类的数组包含您的两个string。

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

不能完全确定你的意思是“自动” – 你可以创build一个包含两个对象的容器对象:

公共类FileImageHolder {string文件名; stringimageName; // TODO:在这里插入东西}

然后把它放在一个数组列表中,并随机化该数组列表。

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

除非有一种方法来检索元素的旧索引后,我会做两种方法之一:

A)制作另一个列表multi_shuffler = [0,1,2,…,file.size()]并将其洗牌。 循环播放以获取您的洗牌文件/图像列表的顺序。

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

或B)使一个StringWrapper类来保存文件/图像名称,并结合你已经得到的两个列表:ArrayList combinedList;