如何判断数组列表中的元素是相同还是不同?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何判断数组列表中的元素是相同还是不同?相关的知识,希望对你有一定的参考价值。
我正在尝试验证数组列表中的所有元素是否相同。这是我的代码:
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");
}
}
将元素放入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与所有其他插槽进行比较,所以你只需将插槽2与插槽3进行比较......直到结束)。
另一种方法是使用Set实现,例如HashSet!集合具有唯一成员。因此,当您将列表转换为集合,并且集合的条目少于列表时,您知道该列表包含重复项。
有各种解决方案。
与其他人比较
您只需要选择任何元素(例如,第一个),然后将其与所有其他元素进行比较。一个简单的循环就足够了:
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;
虽然这段代码非常紧凑,但我赞成更直接的迭代解决方案。它更具可读性和更高效,因为它没有设置集合的额外开销。
您只需将第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");
您只需将当前元素与下一个元素进行比较,如果它们不同则意味着您没有所有元素相同:
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
试试这个 :
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;
}
}
}
使用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;
}
此方法还可用于计算出多少不同的元素。
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);
}
}
如果后面索引上的所有元素都与之相同或不同,则必须检查每个元素。你可以使用这样的嵌套循环来做到这一点:
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
。
。 。 。你的代码有用吗?你得到什么样的输出?你有任何例外吗?不要将List声明为ArrayList;将其声明为List。不要调用List arr;
它不是一个数组。称之为numbers
或类似的东西。你为什么要在第3行获得爆炸标志/非操作员?我认为那不应该存在。如果您考虑可用的不同类型的集合/数据结构,您可以阅读有关here的内容,您将找到一个集合类型,其size()
方法将告诉您有多少不同的元素。
以上是关于如何判断数组列表中的元素是相同还是不同?的主要内容,如果未能解决你的问题,请参考以下文章