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

时间:2015-03-26 20:47:28

标签: java list hashset brute-force

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

(10,10,10,10,10) --> true
(10,10,20,30,30) --> false

我知道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;
}

3 个答案:

答案 0 :(得分:68)

使用Stream API(Java 8 +)

boolean allEqual = list.stream().distinct().limit(2).count() <= 1

boolean allEqual = list.isEmpty() || list.stream().allMatch(list.get(0)::equals);

使用Set

boolean allEqual = new HashSet<String>(tempList).size() <= 1;

使用循环:

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

OP代码的问题

您的代码有两个问题:

  • 由于您要比较String,因此您应使用!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;

甚至

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:3)

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

  

boolean allMatch(Predicate predicate)

     

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

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

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