2

HashMap で値をシャッフルしたいと思います。次のタイプの HashMap があります

Map<Integer,ArrayList<String> > trainDataSet = new HashMap<Integer, ArrayList<String>>();

Map の値をシャッフルしたいと思います。どうすればいいですか?

以下は私の試みです:

    collections.shuffle(trainDataSet.values());

エラーが発生しました:

    Values cannot be cast to java.util.List

はい、これは理にかなっています。なぜなら、私の値は List ではなく Arraylist にあるからです。arraylist のコレクションをシャッフルすることは可能でしょうか?

編集

次の注文がある場合::

key1  [aa,bb,cd]
key2  [xx,xy,sfr]

のようなものに

key1  [xx,xy,sfr]
key2  [aa,bb,cd]
4

3 に答える 3

12

実際には、キーと値をランダムに再関連付けしたいと考えています。これを実現する方法の例を次に示します。

final Map<String, Object> x = new HashMap<String, Object>();
x.put("x", 1); x.put("y", 2); x.put("z", 3); x.put("w", 4);
System.out.println(x);
final List<Object> vs = new ArrayList<Object>(x.values());
Collections.shuffle(vs);
System.out.println(vs);
final Iterator<Object> vIter = vs.iterator();
for (String k : x.keySet()) x.put(k, vIter.next());
System.out.println(x);
于 2012-05-13T12:30:10.977 に答える
1

元の質問での私のコメントに対するあなたの回答によると、マップ内のすべての値を取得してランダムなバケットに入れる方法は次のとおりです。

Random random = new Random();
    Map<Integer,ArrayList<String> > shuffled = new HashMap<Integer, ArrayList<String>>();
    ArrayList<Integer> keys = new ArrayList<Integer>(trainDataSet.keySet());
    for (Integer key : keys) {
        shuffled.put(key, new ArrayList<String>());
    }
    for (ArrayList<String> values : trainDataSet.values()) {
        for (String string : values) {
            Integer randomKey = random.nextInt(keys.size());
            ArrayList<String> list = shuffled.get(randomKey);
            list.add(string);
            shuffled.put(randomKey, list);
        }
    }
于 2012-05-13T12:52:45.683 に答える
1

これは私にとってはうまくいきます:

Collections.shuffle(Arrays.asList(trainDataSet));
于 2015-03-27T05:45:59.633 に答える