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

问题描述 投票:5回答:10

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

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");         
    }
}
java arrays arraylist
10个回答
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中给出了如何有效和一般地解决这个问题的一个例子


2
投票

如果要确保列表包含至少两个不同的元素,则必须“遍历”数组一次:将第一个元素与所有其他元素进行比较,并在第一个不匹配时停止。在不匹配时:并非所有元素都相同,否则它们都是相同的!

但最初的问题有点不清楚。如果要确定数组中是否没有两个相等的元素,则必须将所有条目与所有其他条目进行比较!然后你需要两个循环:你按顺序选择所有元素,将它们与所有其他元素进行比较(分别对应所有其他元素:你已经将插槽1与所有其他插槽进行比较,所以你只需将插槽2与插槽3进行比较......直到结束)。

另一种方法是使用Set实现,例如HashSet!集合具有唯一成员。因此,当您将列表转换为集合,并且集合的条目少于列表时,您知道该列表包含重复项。


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;

虽然这段代码非常紧凑,但我赞成更直接的迭代解决方案。它更具可读性和更高效,因为它没有设置集合的额外开销。


4
投票

您只需将第1项与所有其他项进行比较:

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
投票

您只需将当前元素与下一个元素进行比较,如果它们不同则意味着您没有所有元素相同:

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

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;
        }
    }
}

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;
}

此方法还可用于计算出多少不同的元素。


3
投票

same是一个存储我们想要的结果的标志。 uv是均匀性变量。 对象是您存储在列表中的对象类型(arraylist)

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);
    } 
}

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开始直到数组的右端,因为您不需要检查该索引的左侧,因为它已经在之前的迭代中检查过,并且result已经更新为false


3
投票

。 。 。你的代码有用吗?你得到什么样的输出?你有任何例外吗?不要将List声明为ArrayList;将其声明为List。不要调用List arr;它不是一个数组。称之为numbers或类似的东西。你为什么要在第3行获得爆炸标志/非操作员?我认为那不应该存在。如果您考虑可用的不同类型的集合/数据结构,您可以阅读有关here的内容,您将找到一个集合类型,其size()方法将告诉您有多少不同的元素。

© www.soinside.com 2019 - 2024. All rights reserved.