[英]How to randomize two String collections in the same fashion in distributed system?
[英]How to randomize two ArrayLists in the same fashion?
我有两个彼此相关的arraylist filelist
和imgList
,例如与“e1.jpg”相关的“H1.txt”。 如何根据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"};
使用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);
最简单的方法是将这两个值一起封装到一个类型中,该类型具有图像和文件。 然后建立一个ArrayList
的这一点,将它洗。
这也改进了封装,为您提供了始终自动拥有与图像相同数量的文件的属性。
如果您真的不喜欢这个想法,另一种选择是自己编写 shuffle 代码(有很多在 Java 中修改过的Fisher-Yates shuffle的例子,包括我怀疑的 Stack Overflow 上的几个),然后只对两个列表进行操作同时。 但我强烈建议采用“改进封装”方法。
你可以用地图做到这一点:
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;
不要有两个字符串数组,而是有一个包含两个字符串的自定义类数组。
您可以创建一个包含数字 0 到 5 的数组并将它们打乱。 然后将结果用作“oldIndex -> newIndex”的映射并将此映射应用于原始数组。
不完全确定“自动”是什么意思 - 您可以创建一个包含两个对象的容器对象:
公共类 FileImageHolder { 字符串文件名; 字符串图像名称; //TODO: 在这里插入东西 }
然后将其放入数组列表中并随机化该数组列表。
否则,您需要跟踪每个元素在一个列表中移动的位置,并将其也移动到另一个列表中。
除非有一种方法可以在洗牌后检索元素的旧索引,否则我会采用以下两种方法之一:
A) 创建另一个列表 multi_shuffler = [0, 1, 2, ... , file.size()] 并对其进行洗牌。 循环遍历它以获取您洗牌的文件/图像列表的顺序。
ArrayList newFileList = new ArrayList(); ArrayList newImgList = new ArrayList(); 对于 ( i=0; i
或 B) 创建一个 StringWrapper 类来保存文件/图像名称并将您已经获得的两个列表合并为一个:ArrayList combineList;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.