如何以简单的方式复制类映射结构中的值并获取所有键

How to duplicate values in a Map-like Structure and obtain all keys in a simple way

我正在寻找一种方法来获取 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()

澄清 objective

我确定我在这里重塑了财富,但我一直在寻找一种方法来实现与 List<Map.Entry<?,?>> 功能相同的目标(这基本上与 Map 的结构相同,但允许重复键)并且还能够从该模拟映射中获取所有键。

Map has the method keySet() 尽管在自定义实现的情况下,我不会将键作为集合获取,而是作为列表或其他一些允许重复数据的集合获取。

总结:

  1. 应该可以有重复值
  2. 我应该能够在实例中调用方法并获取所有键值(包括重复的键值)
  3. 一定要简单call/use

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

我在网上查找并找到了这个库 MultiValuedMap,您可以在其中调用方法 keys().iterator() ,它 return 只是键,但作为迭代器而不是正常收集然后我需要一个for(我从一开始就一直希望避免)来复制值

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

您可以使用 Google Guava which has some classes that will work as an extension to the JCF. I will specifically recommend LinkedHashMultimap<K,V> that, in case you are looking for all keys on your Map, you can get a Multiset<E> calling the method keys(), this is a Collection 实现此目的,您可以使用与您使用的相同的方法将其转换为数组。

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

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;
}