首页 > 解决方案 > 如何在类似 Map 的结构中复制值并以简单的方式获取所有键

问题描述

我正在寻找一种方法来获取 Map 的键,其中只有一对值(或重复的键,这对我来说是同义词)作为数组的列表。我发现自己生成了这种实现:

public static Integer[] pairOfValues(){
    class MyMap<T,E> extends ArrayList<AbstractMap.SimpleEntry<T,E>>{
        public ArrayList<T> keys(){
            try {
                ArrayList<T> keys=new ArrayList<>();
                this.forEach(entry -> { keys.add(entry.getKey()); });
                return keys;
            } catch (Exception e) {
                throw new RuntimeException("Impossible to obtain keys from the ArrayList",e);
            }
        }
    }
    
    MyMap<Integer,String> myMap=new MyMap<>(){{
        add(new AbstractMap.SimpleEntry(1,"a"));
        add(new AbstractMap.SimpleEntry(1,"x"));
        add(new AbstractMap.SimpleEntry(2,"b"));
        add(new AbstractMap.SimpleEntry(2,"a"));
    }};

    ArrayList<Integer> onlyKeys=myMap.keys();
    Integer[] requiredArray=onlyKeys.toArray(new Integer[onlyKeys.size()]);
    return requiredArray;
}

我可以在哪里调用方法.keys()

明确目标

我确定我在这里重新发明了财富,但我一直在寻找一种方法来获得与List<Map.Entry<?,?>>功能相同的目标(基本上与 Map 的结构相同,但允许重复的键)并且也有能力获得该模拟地图中的所有键。

Map具有keySet()方法,尽管在自定义实现的情况下,我不会将键作为 Set 而是作为 List 或其他允许重复数据的集合。

总之:

  1. 它应该能够有重复的值
  2. 我应该能够在实例中调用一个方法并获取所有键值(包括重复值)
  3. 调用/使用必须简单

我确定应该有一个已经有人完成的库(我不知道为什么Java中还没有)这将帮助我完成同样的任务,而无需每次我需要一对时都创建这种类的价值观。

我在网上查找,发现了这个库MultiValuedMap,您可以在其中调用方法 keys().iterator() 将只返回键但作为 Iterator 而不是普通集合,那么我将需要一个 for (我一直希望从一开始就避免)复制值

这里的任何人都知道图书馆或可以帮助我们解决这种非常常见的问题/解决方案的东西。

标签: javacollectionsshared-librarieskey-value

解决方案


您可以使用Google Guava来实现这一点,它有一些可以作为JCF扩展的类。我会特别建议LinkedHashMultimap<K,V>,如果你正在寻找你的所有keys东西Map,你可以Multiset<E>调用方法keys(),这是一个集合,你可以用你正在使用的相同方法将它转换成一个数组。

您将从正在使用的示例中获得的代码最终将如下所示:

public static Integer[] pairOfValues(){
    com.google.common.collect.Multimap<Integer,String> myMap=LinkedHashMultimap.create();
    myMap.put(1,"a");
    myMap.put(1,"x");
    myMap.put(2,"b");
    myMap.put(2,"a");

    Multiset<Integer> onlyKeys=myMap.keys();
    Integer[] requiredArray=onlyKeys.toArray(new Integer[onlyKeys.size()]);
    return requiredArray;
}

推荐阅读