如何以相同的方式随机化两个ArrayLists?

时间:2010-11-19 20:10:52

标签: java list collections arraylist

我有两个相互关联的arraylist filelistimgList,例如“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"};

9 个答案:

答案 0 :(得分:575)

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

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

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

答案 1 :(得分:119)

将它们包装在另一个类中,以便最终得到一个数组或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);

答案 2 :(得分:22)

最简单的方法是将两个值封装在一起包含图像和文件的类型中。然后构建的<{1>} 并将其随机播放。

这也改善了封装,为您提供了自动拥有与图像数量相同的文件的属性。

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

答案 3 :(得分:9)

您可以使用地图执行此操作:

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

这将以随机顺序迭代图像。

答案 4 :(得分:5)

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

答案 5 :(得分:4)

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

答案 6 :(得分:3)

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

答案 7 :(得分:2)

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

public class FileImageHolder {     String fileName;     String imageName;     // TODO:在这里插入东西 }

然后将其放入数组列表中并随机化该数组列表。

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

答案 8 :(得分:2)

除非有一种方法可以在洗牌后检索元素的旧索引,否则我会采用以下两种方式之一:

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

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

或B)    创建一个StringWrapper类来保存文件/图像名称,并将已经存在的两个列表合并为一个:ArrayList combinedList;