如何以同样的方式随机化两个ArrayList?
我有两个相关的imgList
filelist
和imgList
,例如与“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;