4

比如说,给你一个List<KVPair>,其中每个KVPair都有一个String keyString Value.equals()做正确事情的方法。

您将如何确认列表中的每个元素都与其他元素相同,或者查看是否至少有一个元素不同?

换句话说,如果我们有

KVPair kvp1 = new KVPAir("key", "value");
KVPair kvp2 = new KVPAir("key", "value");

List<KVPair> l = new ArrayList<KVPair>();
l.add(kvp1);
l.add(kvp2);

我能想到的一种方法是,首先对列表进行排序并迭代直到下一个不像以前那样。

有没有更简单、更干净的方法来找到相同的?

4

3 回答 3

3

如果 hashCode() 也正确实现,您可以将它们全部添加到 HashSet 中,看看是否有重复:

 Set<KVPair> set = new HashSet<KVPair>(l.size());
 for (KVPair p: l){
   if (!set.add(p))
      // you have a duplicate
 }

甚至(有点浪费)

Set<KVPair> set = new HashSet<KVPair)(l);
if (l.size() != set.size())
   // you have a duplicate
if (set.size() < 2)
   // all elements are equal
于 2012-08-03T01:20:08.680 回答
3

这是一个通用的解决方案:

不要忘记做空检查。第一次将元素添加到集合中时,它将始终被添加

public static boolean isListOfSameElements(List<? extends Object> l) {
    Set<Object> set = new HashSet<Object>(l.size());
    for (Object o : l) {
        if (set.isEmpty()) {
            set.add(o);
        } else {
            if (set.add(o)) {
                return false;
            }
        }
    }
    return true;
}
于 2012-08-03T01:42:15.110 回答
1

使用 java 流:

list.stream().distinct().count() == 1
于 2016-11-21T17:07:31.377 回答