【问题标题】:Java - creating permutations from hashmap keysJava - 从哈希映射键创建排列
【发布时间】:2012-09-26 10:28:57
【问题描述】:

所以我有一个包含键和对象的哈希图。我想知道是否可以使用键创建多个排列。例如,如果我有:

1 - 对象 1 2 - 对象2 3 - 对象 3 4 - 对象4

获取随机顺序。所以一个结果可能是:

3 - 对象 3 1 - 对象 1 2 - 对象2 4 - 对象4

到目前为止我有:

Map<Integer, GeoPoint> mapPoints = new HashMap<Integer, GeoPoint>();
Map<Integer, GeoPoint> mapPointsShuffle = new HashMap<Integer, GeoPoint>();

    for (int t =0; t < 50; t ++){

        Collections.shuffle((List<?>) mapPoints);

        mapPointsShuffle.putAll(mapPoints);
    }

所以这个想法是给我 50 个随机排列。但它回来了:

09-26 11:15:27.813: E/AndroidRuntime(20434): java.lang.ClassCastException: java.util.HashMap 无法转换为 java.util.List

有什么想法吗?

【问题讨论】:

  • 为什么需要像 java.util.HashMap 这样的关联集合中的随机排列?
  • mapPoints 是 Map 接口的一个实现。您不能将其转换为 List 接口!

标签: java hash hashmap


【解决方案1】:

java.util.HashMap 没有实现 java.util.List

【讨论】:

    【解决方案2】:

    你应该先从 hashmap 键中创建一个列表:

    List<Integer> keys = new List<Integer>(mapPoints.keySet());
    

    然后您可以使用Collections 中的方法洗牌密钥列表,就像您的帖子显示的那样。

    但是,循环的最后一次调用没有意义:

    mapPointsShuffle.putAll(mapPoints);
    

    即使您将键重新洗牌 50 次,这也会将相同的映射条目添加到另一个映射 50 次以上,从而产生您开始使用的映射,因为散列映射是无序的 .

    【讨论】:

      【解决方案3】:

      如何将地图投射到列表中?

      Collections.shuffle((List) mapPoints);

      您是否要洗牌?对于 HashMap,您无​​法预测返回键的顺序。所以,你最好得到一个列表中的键,然后随机播放。

      【讨论】:

        猜你喜欢
        • 2014-09-16
        • 1970-01-01
        • 2021-06-11
        • 1970-01-01
        • 2018-10-13
        • 1970-01-01
        • 1970-01-01
        • 2023-04-08
        • 1970-01-01
        相关资源
        最近更新 更多