如何判断数组列表中的元素是相同还是不同?

use*_*438 5 java arrays arraylist

我正在尝试验证数组列表中的所有元素是否相同.这是我的代码:

ArrayList<Integer> arr = new ArrayList<>(Arrays.asList(2,2,4,2));
for (int z = 0; z < arr.size(); z++) {          
    if(!arr.get(z++).equals(arr.get(z--))) {
        System.out.println("same"); 
    }else {
        System.out.println("differnt");         
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*o13 10

将元素放入Set.如果结果集的大小为1,则所有元素都相同.一行代码,没有循环,没有索引,适用于每个集合:

boolean allTheSame = new HashSet<Integer>(list).size() == 1;
System.out.println(allTheSame ? "same" : "different");
Run Code Online (Sandbox Code Playgroud)

(编辑:)

这可能是值得指出的是,如果该列表很大,并且很可能包含许多不同的元素,那么构建Set将对一些内存开销可以是可以避免的,如果需要的话.在这种情况下,您将迭代列表并将所有元素与第一个元素进行比较.但是,你应该不会检查元素与身份==.相反,你应该使用他们的equals方法比较它们,或者,如果你慷慨地想要处理null条目,使用Objects#equals.

Zabuza答案中给出了如何有效和一般地解决这个问题的一个例子

  • @Zabuza这是一个有效的观点.我急忙在"编辑"中添加了代码.实际上,使用泛型和`Iterator`或增强`for`循环的解决方案会更合适.所以我再次编辑,只是指出了这个替代背后的原因,并链接到你的代码答案. (2认同)

Zab*_*uza 6

有多种解决方案。


与他人比较

您只需要选择任何元素(例如第一个元素),然后将其与所有其他元素进行比较即可。一个简单的循环就足够了:

public static <E> areElementsEquals(List<E> list) {
    // Edge cases
    if (list == null || list.size() <= 1) {
        return true;
    }

    // Pick any element
    E any = list.get(0);
    // Compare against others
    for (E other : list) {
        // Use Objects#equals for null-safety
        if (!Objects.equals(any, other)) {
            return false;
        }
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

或Stream-API版本:

return list.stream()
    .allMatch(other -> Objects.equals(any, other));
Run Code Online (Sandbox Code Playgroud)

如果检查any的不是null,也可以使用方法参考:

return list.stream()
    .allMatch(any::equals);
Run Code Online (Sandbox Code Playgroud)

集没有重复项。您可以将所有元素放入Set1,然后检查大小是否为,则所有其他元素都是重复的。

return new HashSet<>(list).size() == 1;
Run Code Online (Sandbox Code Playgroud)

尽管此代码非常紧凑,但我希望使用更直接的迭代解决方案。因为它没有设置集合的额外开销,所以它更具可读性和效率。