Java所有确定元素在列表中是相同的

Col*_*ong 28 java list brute-force hashset

我试图确定列表中的所有元素是否相同.如:

(10,10,10,10,10) --> true
(10,10,20,30,30) --> false
Run Code Online (Sandbox Code Playgroud)

我知道hashset可能会有所帮助,但我不知道如何用java编写.

这是我尝试过的,但没有用:

public static boolean allElementsTheSame(List<String> templist) 
{

    boolean flag = true;
    String first = templist.get(0);

    for (int i = 1; i< templist.size() && flag; i++)
    {
        if(templist.get(i) != first) flag = false;
    }

    return true;
}
Run Code Online (Sandbox Code Playgroud)

aio*_*obe 75

使用Stream API(Java 8+)

boolean allEqual = list.stream().distinct().limit(2).count() <= 1
Run Code Online (Sandbox Code Playgroud)

要么

boolean allEqual = list.isEmpty() || list.stream().allMatch(list.get(0)::equals);
Run Code Online (Sandbox Code Playgroud)

使用Set:

boolean allEqual = new HashSet<String>(tempList).size() <= 1;
Run Code Online (Sandbox Code Playgroud)

使用循环:

boolean allEqual = true;
for (String s : list) {
    if(!s.equals(list.get(0)))
        allEqual = false;
}
Run Code Online (Sandbox Code Playgroud)

OP代码的问题

您的代码有两个问题:

  • 既然你要比较Strings,你应该使用!templist.get(i).equals(first)而不是!=.

  • 你有return true;它应有的时间return flag;

除此之外,你的算法是合理的,但你可以在没有flag这样做的情况下逃脱:

String first = templist.get(0);
for (int i = 1; i < templist.size(); i++) {
    if(!templist.get(i).equals(first))
        return false;
}
return true;
Run Code Online (Sandbox Code Playgroud)

甚至

String first = templist.get(0);
for (String s : templist) {
    if(!s.equals(first))
        return false;
}
return true;
Run Code Online (Sandbox Code Playgroud)

  • @ PM77-1,对于`(1,2,3,4,5)`列表,`limit(2)`将确保它在`(1,2)`之后提前终止. (3认同)
  • 它对具有许多独特元素的大型列表产生了影响.例如考虑`("0000000001","000000002",......,"999999999")`.查看两个第一个元素显然更快,然后必须计算总共有多少个独特元素. (2认同)
  • 不幸的是,使用`HashSet` 的`allSame` 方法的解决方案被删除了......不过,使用带有**1 的1_000_000 个字符串进行了一些(非代表性的)性能测试。)第三个值与所有其他值不同:** for 循环: 0ms, set:31ms, stream:47ms, **2.) 所有值都相等:** for-loop:18ms, set:32ms, stream:85ms,所以`Set`解决方案并不是最糟糕的;公认的“流”解决方案似乎是性能最低的解决方案,而普通的 for 循环获胜;结论:衡量性能总是好的...... (2认同)

dar*_*enp 7

列表中值的频率将与列表的大小相同.

boolean allEqual = Collections.frequency(templist, list.get(0)) == templist.size()


And*_*ira 6

这是该方法的一个很好的用例Stream.allMatch()

布尔 allMatch(谓词谓词)

返回此流的所有元素是否与提供的谓词匹配。

您甚至可以使您的方法通用,因此它可以与任何类型的列表一起使用:

static boolean allElementsTheSame(List<?> templist) {
    return templist.stream().allMatch(e -> e.equals(templist.get(0)));
}
Run Code Online (Sandbox Code Playgroud)