Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何以相同的方式随机化两个ArrayList?_Java_List_Collections_Arraylist - Fatal编程技术网

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

Java 如何以相同的方式随机化两个ArrayList?,java,list,collections,arraylist,Java,List,Collections,Arraylist,我有两个相互关联的arraylistfilelist和imgList,例如与“e1.jpg”相关的“H1.txt”。如何根据文件列表的随机化自动随机化imgList列表?就像在excel中一样,如果我们对某一列进行排序,另一列将自动跟随 String [] file = {"H1.txt","H2.txt","H3.txt","M4.txt","M5.txt","M6.txt"}; ArrayList<String> fileList = new ArrayList<Strin

我有两个相互关联的arraylist
filelist
imgList
,例如与“e1.jpg”相关的“H1.txt”。如何根据
文件列表的随机化自动随机化
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);
预期产出:

 imgList = {"e4.jpg","e6.jpg","e3.jpg","e5.jpg","e2.jpg","e1.jpg"};

将它们包装到另一个类中,这样您就可以得到这些对象的单个数组或
列表

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);
List List=new ArrayList();
添加(新数据(“H1.txt”、“e1.jpg”);
添加(新数据(“H2.txt”、“e2.jpg”);
// ...
集合。洗牌(列表);

最简单的方法是将这两个值封装到一个包含图像和文件的类型中。然后构建一个
ArrayList
,并将其洗牌

这也提高了封装性,使您能够始终自动拥有与图像相同数量的文件


如果您真的不喜欢这个想法,另一种方法是自己编写洗牌代码(Java中有很多修改过的示例,我怀疑其中包括几个堆栈溢出),然后同时对两个列表进行操作。但我强烈建议使用“改进封装”方法。

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

您可以使用映射来实现这一点:

Map<String, String> fileToImg:
List<String> fileList = new ArrayList(fileToImg.keySet());
Collections.shuffle(fileList);
for(String item: fileList) {
    fileToImf.get(item);
}
Map fileToImg:
List fileList=newarraylist(fileToImg.keySet());
Collections.shuffle(文件列表);
用于(字符串项:文件列表){
fileToImf.get(项目);
}

这将以随机顺序遍历图像。

您可以创建一个包含数字0到5的数组,并将其洗牌。然后将结果用作“oldIndex->newIndex”的映射,并将此映射应用于两个原始数组。

使用两次,两个
随机对象使用相同的种子初始化:

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

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

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

公共类文件映像持有者{ 字符串文件名; 字符串图像名称; //TODO:在此处插入内容 }

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


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

除非有办法在元素被洗牌后检索元素的旧索引,否则我将使用以下两种方法之一:

(A) 制作另一个列表multi_shuffler=[0,1,2,…,file.size()]并将其洗牌。在上面循环以获得无序文件/图像列表的顺序

ArrayList newFileList=新ArrayList(); ArrayList newImgList=新的ArrayList(); 对于(i=0;i 或B)
创建一个StringWrapper类来保存文件/图像名称,并将已经得到的两个列表合并到一个列表中:ArrayList combinedList

这可以使用洗牌方法完成:

private List<Integer> getJumbledList() {
     List<Integer> myArrayList2 = new ArrayList<Integer>();
        myArrayList2.add(8);
        myArrayList2.add(4);
        myArrayList2.add(9);
        Collections.shuffle(myArrayList2);
        return myArrayList2;
private List getJumbledList(){
List MyArrayList 2=新建ArrayList();
MyArrayList 2.add(8);
MyArrayList 2.添加(4);
MyArrayList 2.add(9);
Collections.shuffle(myArrayList2);
返回myArrayList2;

这是一个面向对象的Java解决方案。也许,应该如何做…:)
private List<Integer> getJumbledList() {
     List<Integer> myArrayList2 = new ArrayList<Integer>();
        myArrayList2.add(8);
        myArrayList2.add(4);
        myArrayList2.add(9);
        Collections.shuffle(myArrayList2);
        return myArrayList2;