2つのArrayListを同じ方法でランダム化する方法は?


257

2つの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);

ランダム化後の出力:

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

回答:


585

Collections.shuffle()2回使用し、2つのRandomオブジェクトを同じシードで初期化します。

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

Random同じシードを持つ2つのオブジェクトを使用すると、両方のリストがまったく同じ方法でシャッフルされます。これにより、2つの別個のコレクションが可能になります。


121

それらを別のクラスでラップして、単一の配列または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);

10
これは、Javaのオブジェクト指向ソリューションです。おそらく、それをどのように行うべきか... :)
Evan

22

最も簡単な方法は、2つの値を一緒にカプセル化して、画像とファイルの両方を持つタイプにすることです。[ビルドArrayListことをして、それをシャッフルします。

これによりカプセル化も改善され、常に画像と同じ数のファイルが自動的に保持されるという特性が得られます。

そのアイデアが本当に気に入らない場合の代替策は、自分でシャッフルコードを書くことです(スタックオーバーフローのいくつかを含む、変更されたフィッシャーイェーツのシャッフルの例がJavaにたくさんあります)。同時に。ただし、「カプセル化の改善」アプローチを採用することを強くお勧めします。


11

あなたはマップでこれを行うことができます:

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

これにより、ランダムな順序で画像が繰り返されます。


5

これは、シャッフルメソッドを使用して実行できます。

private List<Integer> getJumbledList() {
     List<Integer> myArrayList2 = new ArrayList<Integer>();
        myArrayList2.add(8);
        myArrayList2.add(4);
        myArrayList2.add(9);
        Collections.shuffle(myArrayList2);
        return myArrayList2;

4

文字列の配列が2つある代わりに、2つの文字列を含むカスタムクラスの配列が1つあります。


3

0から5までの数字を含む配列を作成し、それらをシャッフルできます。次に、結果を「oldIndex->​​ newIndex」のマッピングとして使用し、このマッピングを元の両方の配列に適用します。


2

「自動的に」の意味が完全にわからない-両方のオブジェクトを保持するコンテナオブジェクトを作成できます。

パブリッククラスFileImageHolder {String fileName; 文字列imageName; // TODO:ここに内容を挿入します}

そして、それを配列リストに入れ、その配列リストをランダム化します。

それ以外の場合は、各要素が1つのリストで移動した場所を追跡し、他のリストでも移動する必要があります。


2

要素がシャッフルされた後に要素の古いインデックスを取得する方法がない限り、次の2つの方法のいずれかを使用します。

A)別のリストmulti_shuffler = [0、1、2、...、file.size()]を作成し、それをシャッフルします。ループして、シャッフルされたファイル/画像リストの順序を取得します。

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

またはB)StringWrapperクラスを作成して、ファイル/イメージ名を保持し、すでに取得した2つのリストを1つに結合します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.