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在答案中给出了如何有效和一般地解决这个问题的一个例子
有多种解决方案。
您只需要选择任何元素(例如第一个元素),然后将其与所有其他元素进行比较即可。一个简单的循环就足够了:
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)
集没有重复项。您可以将所有元素放入Set中1,然后检查大小是否为,则所有其他元素都是重复的。
return new HashSet<>(list).size() == 1;
Run Code Online (Sandbox Code Playgroud)
尽管此代码非常紧凑,但我希望使用更直接的迭代解决方案。因为它没有设置集合的额外开销,所以它更具可读性和效率。
| 归档时间: |
|
| 查看次数: |
191 次 |
| 最近记录: |