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

Jes*_*ssy 255 java collections list arraylist

我有两个arraylist filelist并且imgList彼此相关,例如与"e1.jpg"相关的"H1.txt".如何自动随机名单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);
Run Code Online (Sandbox Code Playgroud)

随机化后的输出例如:

fileList = {"M4.txt","M6.txt","H3.txt","M5.txt","H2.txt","H1.txt"};
Run Code Online (Sandbox Code Playgroud)

预期输出:

 imgList = {"e4.jpg","e6.jpg","e3.jpg","e5.jpg","e2.jpg","e1.jpg"};
Run Code Online (Sandbox Code Playgroud)

Mic*_*rdt 579

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

long seed = System.nanoTime();
Collections.shuffle(fileList, new Random(seed));
Collections.shuffle(imgList, new Random(seed));
Run Code Online (Sandbox Code Playgroud)

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


Bal*_*usC 121

将它们包装在另一个类中,以便最终得到单个数组或List这些对象.

public class Data {
    private String txtFileName;
    private String imgFileName;

    // Add/generate c'tor, getter/setter, equals, hashCode and other boilerplate.
}
Run Code Online (Sandbox Code Playgroud)

用法示例:

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);
Run Code Online (Sandbox Code Playgroud)

  • 这是面向对象的Java解决方案.也许,应该怎么做...... :) (10认同)

Jon*_*eet 22

最简单的方法是将两个值封装在一起包含图像和文件的类型中.然后建立一个ArrayList那个和洗牌了.

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

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


jjn*_*guy 11

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

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

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


小智 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;
Run Code Online (Sandbox Code Playgroud)