2

我想对 HashMap 中的值进行洗牌。我有以下类型的 HashMap

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

我想洗牌地图中的值。我该怎么做?

以下是我的尝试:

    collections.shuffle(trainDataSet.values());

出现错误:

    Values cannot be cast to java.util.List

是的,这是有道理的,因为我的值在 Arraylist 中而不是在 List 中。是否可以洗牌数组列表的集合?

编辑

如果我有以下订单::

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 回答