Java:计算 Map 中的唯一值

Java: Count unique values in a Map

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

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

遗憾的是没有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();

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

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

int count = new HashSet<V>(myMap.values()).size();

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

您可以只使用 Collection.size() 方法。

Map<K, V> myMap = ...
Collection<V> valueSet = myMap.values();
int size = valueSet.size();

Java 8 已经有一段时间了:

int count = myMap.values().stream().distinct().count();

如果您想要一个仅包含以下值的集合:

Map<K,V> myMap = ...//initiate Map;
Set<V> set = new HashSet<V>(myMap.values());
int numberUniqueB = set.size();

了解接口 Map<K,V>,检查一下 Java MAP Documentation