2017-12-27 56 views
-1

わたしたちが知っているように、ArrayListのシャッフルは、Collections.shuffleの方法で行うことができます。シャッフル多次元List、ArrayList、LinkedList

しかし、それは多次元順次コレクションでどのように機能しますか?

次のように私はパターンを持っている場合:

1,2,3 
4,5,6 
7,8,9 

私はこのような何かを達成したい:

1,5,7 
2,3,8 
9,4,6 

Collection.shuffleを()のみの行または列のいずれかを入れ替え、私はしたいですすべての要素を完全に独立させる。

私は、NOT WANT:

1,3,2 
5,6,4 
7,9,8 
+0

どのような結果が期待されますか? – bcsb1001

+0

すべての要素が無作為にシャッフルされるarraylist –

+0

私はあなたの適応された質問の解決策で自分の答えを広げました。 – Ward

答えて

1

あなただけの多次元リストにCollection.shuffleを呼び出した場合、それはそのリスト内のサブリストの順番をシャッフルします。

代わりにすべてのサブリストをシャッフルしたい場合は、サブリストごとにCollection.shuffleを呼び出す必要があります。編集した質問の後

final List<List<String>> list = Arrays.asList(
     Arrays.asList("A", "B", "C"), 
     Arrays.asList("X", "Y", "Z"), 
     Arrays.asList("1", "2", "3") 

); 

// 1. Will shuffle the order of the sub-lists 
Collections.shuffle(list); 

// 2.a. Will shuffle all the sub-lists 
list.forEach(sublist -> Collections.shuffle(sublist)); 

// 2.b. Or the same, with method reference instead of lambda 
list.forEach(Collections::shuffle); 

編集

要件は、すべてのサブリストのすべての要素をシャッフルしても、サブリストの間の要素をミックスすることは本当にある場合は、上記のコードでは十分ではありません。あなたが要求として

以下のコードは行いますが、それは(この場合は3で)すべてのサブリストが同じサイズを持っていると仮定します:

// 1. Add all values in single dimension list  
List<String> allValues = list.stream() 
     .flatMap(List::stream) 
     .collect(toList()); 

// 2. Shuffle all those values 
Collections.shuffle(allValues); 

// 3. Re-create the multidimensional List 
List<List<String>> shuffledValues = new ArrayList<>(); 
for (int i = 0; i < allValues.size(); i = i + 3) { 
    shuffledValues.add(allValues.subList(i, i+3)); 
} 
+0

シャッフルサブリストとシャッフル要素をそれぞれのサブリストに入れて、すべての要素が完全な新しい順序になるようにします。 –

+0

[OK]をクリックすると、私の上に掲載されたコードはこれを正確に行います。 – Ward

+0

ありがとう、それは私が欲しいものをするようです –

0

あなたが深いシャッフルをしたい場合は、Iリスト内の各項目が別のリストであるかどうかをチェックし、そのリストを再帰的にシャッフルする方法を推奨します。このような何か:

public static void deepShuffle(List<?> mutliDimensionList) { 
    for (Object item : mutliDimensionList) { 
     if (item instanceof List) { 
      deepShuffle((List<?>)item); 
     } 
    } 
    Collections.shuffle(mutliDimensionList); 
} 

あなたが潜在的にForkJoinPoolまたは類似した何かのパフォーマンスを向上させるためにマルチスレッドを追加することができます。しかし、それはあなたのユースケースに完全に依存します。

この回答は編集した質問には適用されません。しかし、個々のサブリストを個別にシャッフルする必要がある場合には、これはうまくいくはずです。