【问题标题】:Is it possible to get submap for unsorted map without loop?是否可以在没有循环的情况下获取未排序地图的子图?
【发布时间】:2015-03-27 03:04:32
【问题描述】:

我从另一个方法得到Map 的实例

Map map = service.getMap();

现在我想从这张地图中获取任意 10 个元素。

我知道我可以遍历Map.Entry,但我不喜欢这个决定。

还有其他方法吗?

【问题讨论】:

  • 您需要 10 个真正随机的元素吗?愚蠢的想法 - 你可以提取所有元素,随机播放 - 选择前 10 个。更重要的是 - 为什么需要它?
  • 鉴于您不能对地图的键使用随机访问,显而易见的解决方法是收集 ListCollections.shuffle()List 中的键并获取前 10 个元素...
  • @Mysterion random 不是目的。没有重复的任何元素
  • 您使用的地图类型是什么?是hashmap/treemap等吗?
  • 那你要使用“任意”这个词。

标签: java dictionary collections


【解决方案1】:

显然您想要的是地图中的 10 个 任意 元素。这可以通过一个简单的 Java 8 习语来实现:

set.entrySet().stream().limit(10).collect(toList());

【讨论】:

    【解决方案2】:

    如果您只需要值,我会建议这样的方法:

    Map map = service.getMap();
    Object[] array= map.entrySet().toArray();
    Arrays.copyOfRange(array, 0, 10);
    

    或使用泛型

    Map<Key, Value> map = service.getMap();
    Map.Entry<Key, Value>[] array = (Map.Entry<Key, Value>[]) map.entrySet().toArray(new Map.Entry[0]);
    Arrays.copyOfRange(array, 0, 10);
    

    Map.Entry 有getKey()getValue()

    【讨论】:

    • @gstackoverflow entrySet 有键和值。
    • @Kate 欢迎来到 StackOverflow,我冒昧地添加了泛型,这样您就可以看到有一个键和一个值。
    • 以下代码执行的结果是一个Map.Entry的数组
    • 根据我的问题结果应该是地图
    【解决方案3】:

    您可以使用中间列表来保存键,然后从中选择随机元素。例如,这段代码创建了一个包含 15 个元素的 Map,然后从中随机选择 10 个:

    public static void main(String[] args) throws Exception {
        Map<Integer, String> map = new HashMap<>();
        for(int x = 0; x < 15; x++) {
            map.put(x, "val: " + String.valueOf(x));
        }
    
        List<Integer> keyList = new ArrayList<>(map.keySet());
        Map<Integer, String> randomMap = new HashMap();
        for(int x = 0; x < 10 && !keyList.isEmpty(); x++) {
            Integer key = keyList.remove(new Random().nextInt(keyList.size()));
            randomMap.put(key, map.get(key));
        }
        System.out.println(randomMap);
    }
    

    这还有一个优点,它实际上是在选择随机元素,而不是其他解决方案,它只返回前 10 个元素,每次都会给你相同的 10 个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-07
      • 2019-03-11
      • 1970-01-01
      相关资源
      最近更新 更多