java java教學 - 如何以相同的方式隨機化兩個ArrayLists?




arraylist<> arraylist中文 (9)

我有兩個相關的arraylist filelistimgList ,例如與“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"};

Answers

將它們包裝在另一個類中,以便最終生成一個數組或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的例子,包括我懷疑的中的幾個例子),並且只是在兩個列表上運行同一時間。 但我強烈建議使用“改進封裝”方法。


使用Collections.shuffle()兩次,使用相同的種子初始化兩個Random對象:

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

使用具有相同種子的兩個Random對象確保兩個列表將以完全相同的方式進行混洗。 這允許兩個單獨的集合。


不能完全確定你的意思是“自動” - 你可以創建一個包含兩個對象的容器對象:

公共類FileImageHolder {String fileName; 字符串imageName; // TODO:在這裡插入東西}

然後將其放入數組列表中並隨機化該數組列表。

否則,您需要跟踪每個元素在一個列表中移動的位置,並將其移動到另一個列表中。


你可以用地圖來做到這一點:

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

這將以隨機順序遍歷圖像。


除非有一種方法可以在它們被洗牌後檢索元素的舊索引,否則我會採取以下兩種方法之一:

A)製作另一個列表multi_shuffler = [0,1,2,...,file.size()]並對其進行洗牌。 循環播放以獲取您洗牌過的文件/圖像列表的順序。

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

或者B)創建一個StringWrapper類來保存文件/圖像名稱,並將已經存在的兩個列表合併為一個:ArrayList combinedList;


而不是有兩個字符串數組,有一個包含您的兩個字符串的自定義類的數組。


您可以創建一個包含數字0到5的數組並對其進行洗牌。 然後將結果用作“oldIndex - > newIndex”的映射,並將此映射應用於您的原始數組。


一種非正式的方法:

l = ["", False, 0, '', [], {}, ()]
if all(bool(x) for x in l):
    # do your stuff.






java list collections arraylist