Java:计算地图中的唯一值

Ben*_*Ben 3 java dictionary

在 aMap<K,V>我想知道有多少唯一值V。有没有类似的东西getValueSet()可以让我得到这个集合的大小?在伪代码中:

Map<K,V> myMap = ...//initiate Map;
Set<V> valueSet = myMap.getValueSet()
int numberUniqueB = valueSet.size();
Run Code Online (Sandbox Code Playgroud)

不幸的是没有getValueSet方法。或者,我可以像这样自己遍历列表:

Set<V> mySet = new HashSet<V>();
    for(Map.Entry<K,V> entry : myMap.entrySet()){
    V value = entry.getValue();
    mySet.add(value);
    }
int countUniqueB = mySet.size();
Run Code Online (Sandbox Code Playgroud)

但这似乎是我在重新发明轮子。是否有什么Collections地方或其他地方已经做了我正在寻找的东西?如果没有,是否有比我上面的方法更有效的方法来获得结果?

Boh*_*ian 7

Java 8 已经问世有一段时间了:

int count = myMap.values().stream().distinct().count();
Run Code Online (Sandbox Code Playgroud)


Aas*_*set 5

大多数Collection实现的构造函数都将另一个Collection作为参数,因此您可以将 的值Map直接提供给HashSet构造函数:

int count = new HashSet<V>(myMap.values()).size();
Run Code Online (Sandbox Code Playgroud)

在计算上,这与您的代码一样昂贵,但由于 aMap中的值通常不存储在 a 中Set- 因此您必须创建 aSet来查找唯一计数(或者,可选地对值进行排序,但这可能会更慢)。