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

时间:2019-02-16 11:48:38

标签: 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");         
    }
}

10 个答案:

答案 0 :(得分:10)

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

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

(已编辑:)

可能值得注意的是,如果列表很大,并且可能包含许多不同的元素,那么构造一个Set会增加可以如果需要,请避免。在这种情况下,您将遍历列表并将所有元素与第一个元素进行比较。 但是,您应该使用==检查元素的身份。相反,您应该使用它们的equals方法对它们进行比较,或者,如果您很想处理null条目,则可以使用Objects#equals

answer by Zabuza

中给出了一个如何有效而通用地解决此问题的示例。

答案 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!集具有唯一成员。因此,当您将列表变成一个集合,并且集合中的条目少于列表时,就知道列表包含重复项。