我正在尝试验证数组列表中的所有元素是否相同。这是我的代码:
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");
}
}
答案 0 :(得分:10)
将元素放入Set
中。如果结果集的大小为1,则所有元素都相同。一行代码,没有循环,没有索引,可用于每个集合:
boolean allTheSame = new HashSet<Integer>(list).size() == 1;
System.out.println(allTheSame ? "same" : "different");
(已编辑:)
可能值得注意的是,如果列表很大,并且可能包含许多不同的元素,那么构造一个Set
会增加可以如果需要,请避免。在这种情况下,您将遍历列表并将所有元素与第一个元素进行比较。 但是,您应该不使用==
检查元素的身份。相反,您应该使用它们的equals
方法对它们进行比较,或者,如果您很想处理null
条目,则可以使用Objects#equals
。
答案 1 :(得分: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;
}
或Stream-API版本:
return list.stream()
.allMatch(other -> Objects.equals(any, other));
如果您检查any
不是null
,则还可以使用方法引用:
return list.stream()
.allMatch(any::equals);
集没有重复项。您可以将所有元素放入Set
中,并检查大小是否为1
,然后其他所有元素都是重复的。
return new HashSet<>(list).size() == 1;
尽管此代码非常紧凑,但我希望使用更直接的迭代解决方案。它具有更高的可读性和效率,因为它没有设置集合的额外开销。
答案 2 :(得分:4)
您只需将第一个项目与所有其他项目进行比较:
int a = arr.get(0);
boolean allSame = true;
for (int z = 1; z < arr.size(); z++) {
allSame = (a == arr.get(z));
if (!allSame) break;
}
if (allSame)
System.out.println("Same");
else
System.out.println("Different");
答案 3 :(得分:3)
您只需将当前元素与下一个元素进行比较,如果它们不同,则意味着您没有所有元素相同:
for(int i = 0; i < list.size() - 1; i++) {
if (list.get(i) != list.get(i + 1)) {
return false; // elements are different
}
}
return true; // all element are the same
答案 4 :(得分:3)
尝试一下:
String first = arr.get(0);
boolean allTheSame = true;
if (arr.size() > 1) {
for (int z = 1; z < arr.size(); z++) {
if (!arr.get(z).equals(first)) {
allTheSame = false;
break;
}
}
}
答案 5 :(得分:3)
如果稍后索引上的所有元素都相同或不同,则必须检查每个元素。 您可以使用这样的嵌套循环来做到这一点:
public static void main(String[] args) {
// write your code here
ArrayList<Integer> arr = new ArrayList<Integer>(Arrays.asList(2,2,4,2));
boolean result=true;
for (int i = 0; i < arr.size(); i++) {
for (int j=i; j<arr.size(); j++){
if (!arr.get(i).equals(arr.get(j))){
result=false;
}
}
}
System.out.println(result);
}
第二个循环从j=i
开始,一直到数组的右端,因为您不需要检查该索引的左侧,因为先前的迭代和{{1 }}已更新为result
。
答案 6 :(得分:3)
一种使用BitSet
来判断列表中所有元素是否相同的方法,它需要较少的内存并运行得更快。
public static boolean areAllElementsSame(List<Integer> numbers) {
BitSet set = new BitSet();
numbers.forEach(new Consumer<Integer>() {
@Override
public void accept(Integer integer) {
set.set(integer);
}
});
return set.cardinality() == 1;
}
此方法还可以用于找出多少个不同的元素。
答案 7 :(得分:3)
same是存储我们预期结果的标志。
uv是均匀性变量。
对象是您存储在列表(数组列表)中的对象的类型
import java.util.*;
class Main{
public static void main(String args[]){
ArrayList<Integer> arr = new ArrayList<>(Arrays.asList(2,2,2,2));
boolean same=true;
Object uv=arr.get(0);
for (Object i: arr){
if(!i.equals(uv)){
same=false;
break;
}
}
System.out.print("Result:"+same);
}
}
答案 8 :(得分:3)
。 。 。并且您的代码有效吗?您得到什么样的输出?您有例外吗?
不要将您的列表声明为ArrayList;声明为列表。不要调用列表arr;
,它不是数组。称为numbers
或类似名称。
为什么在第3行中出现爆炸符号/非运算符?我认为那不应该在那里。
如果您考虑到可用的不同种类的收集/数据结构,您可以阅读关于here的信息,那么您会发现一种收集类型,其size()
方法将告诉您您有多少个不同的元素。>
答案 9 :(得分:2)
如果要确保列表包含至少两个不同的元素,则必须“遍历”该数组一次:将第一个元素与所有其他元素进行比较,并在第一个不匹配项上停止。不匹配时:并非所有元素都是相同的,否则它们都是相同的!
但是最初的问题还不清楚。如果要确定数组中是否存在不两个相等的元素,则必须将所有条目与所有其他条目进行比较!然后,您需要两个循环:依次选择所有元素,以将它们与所有其他元素进行比较(分别与以下所有元素进行比较:您已经将插槽1与所有其他插槽进行了比较,因此您仅需将插槽2与插槽3进行比较...直到结束)。
另一种方法是使用Set实现,例如HashSet!集具有唯一成员。因此,当您将列表变成一个集合,并且集合中的条目少于列表时,就知道列表包含重复项。