如何以相同的方式随机化两个数组列表?

2022-08-31 05:27:58

我有两个数组列表,它们彼此相关,例如“H1.txt”与“e1.jpg”相关。如何根据随机化自动随机化列表?就像在excel中一样,如果我们对某个列进行排序,另一列将自动跟随?filelistimgListimgListfileList

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

答案 1

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

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

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


答案 2

将它们包装在另一个类中,以便最终可以获得单个数组或这些对象。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);