Java:统计Map中唯一值的数量

5

在一个 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或其他地方已经实现了我要找的功能?如果没有,是否有比我上面的方法更有效的方法来获得结果?

4个回答

7

Java 8已经存在一段时间了:

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

我以前没有使用过流,但这个代码看起来不错并且能够正常工作。到目前为止,Java 8 对我来说只是“Java.Time”(仅仅因为它有这个功能而已)。我需要阅读一些资料。谢谢! - Ben

5

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

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

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


这个很好用,你是第一个回答的,但我认为我需要采纳@Bohemian的Java 8答案。不过还是谢谢你,比我的代码好多了! - Ben
@Ben:我同意;尽可能采用Java 8 :D - Aasmund Eldhuset

0
如果您想要一个仅包含值的集合:
Map<K,V> myMap = ...//initiate Map;
Set<V> set = new HashSet<V>(myMap.values());
int numberUniqueB = set.size();

阅读有关接口 Map<K,V> 的内容,查看这里 Java MAP 文档


-1
你可以直接使用 Collection.size() 方法。
Map<K, V> myMap = ...
Collection<V> valueSet = myMap.values();
int size = valueSet.size();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接