Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何检查两个ArrayList是否不同,我不知道';我不在乎什么';她变了_Java_Arraylist - Fatal编程技术网

Java 如何检查两个ArrayList是否不同,我不知道';我不在乎什么';她变了

Java 如何检查两个ArrayList是否不同,我不知道';我不在乎什么';她变了,java,arraylist,Java,Arraylist,如何检查两个ArrayList是否彼此不同?我不在乎有什么不同,我只想知道它们是否不同 我每分钟都从数据库中获取分数列表,只有当我获取的分数列表与我一分钟前获取的分数列表不同时,我才会将其发送给客户端 现在ArrayList的值实际上是我创建的一个类(包含name、lvl、rank、score) 我需要在上面实现equals()吗?使用equals()。只要列表中的元素正确实现equals(),它就会返回正确的值 除非要忽略值的顺序,否则应将值转储到两个Set对象中,并使用equals()对“相

如何检查两个ArrayList是否彼此不同?我不在乎有什么不同,我只想知道它们是否不同

我每分钟都从数据库中获取分数列表,只有当我获取的分数列表与我一分钟前获取的分数列表不同时,我才会将其发送给客户端

现在ArrayList的值实际上是我创建的一个类(包含name、lvl、rank、score)

我需要在上面实现
equals()
吗?

使用
equals()
。只要列表中的元素正确实现
equals()
,它就会返回正确的值

除非要忽略值的顺序,否则应将值转储到两个
Set
对象中,并使用
equals()

对“相同性”的定义进行比较 正如Joachim所指出的,对于大多数应用程序,定义是有效的:

比较指定对象与此列表是否相等。返回
true
当且仅当指定的对象也是列表时,两个列表的大小相同,并且两个列表中所有对应的元素对相等。(如果
(e1==null?e2==null:e1.equals(e2))
,则两个元素
e1
e2
相等。换句话说,如果两个列表以相同的顺序包含相同的元素,则它们被定义为相等。此定义确保
equals
方法在
List
接口的不同实现中正常工作

不过,根据您使用它的方式,这可能无法按预期工作。例如,如果您有一个
列表
,它就不能正常工作,因为数组继承了
对象
中的
equals
,该对象将equality定义为引用标识

    List<int[]> list1 = Arrays.asList(new int[] { 1, 2, 3 });
    List<int[]> list2 = Arrays.asList(new int[] { 1, 2, 3 });
    System.out.println(list1.equals(list2)); // prints "false"
您还提到列表必须包含相同类型的元素。下面是另一个示例,其中元素没有相同的类型,但是它们
等于

    List<Number> list1 = new ArrayList<Number>();
    List<String> list2 = new ArrayList<String>();
    System.out.println(list1.equals(list2)); // prints "true"
    List<Object> list1 = new ArrayList<Object>();
    List<Object> list2 = new ArrayList<Object>();
    list1.add(new ArrayList<Integer>());
    list2.add(new LinkedList<String>());
    System.out.println(list1.equals(list2)); // prints "true"
List list1=new ArrayList();
List list2=新的ArrayList();
添加(新的ArrayList());
list2.add(newlinkedlist());
System.out.println(list1.equals(list2));//打印“真实”
因此,除非你明确定义平等对你意味着什么,否则这个问题可能会有非常不同的答案。不过,对于大多数实际用途,
List.equals
应该就足够了


关于实现
等于

更新后的信息表明,只要元素正确实现
equals
(因为
List.equals
根据上面的API文档对非
null
-元素调用
E.equals
),那么
List.equals
就可以很好地完成这项工作

所以在这种情况下,如果我们有一个
列表
,那么
玩家
必须
@覆盖等于(对象o)
才能返回
如果
玩家的实例
和相关字段上,它们都是
等于
(对于引用类型)或
=
(对于原语)

当然,当您
@Override equals
时,还应该
@Override int hashCode()
。勉强可以接受的最小值是返回42;稍微好一点的是
返回name.hashCode();最好的方法是使用一个公式,该公式包含定义
等于的所有字段。一个好的IDE可以自动为您生成
equals/hashCode
方法

另见
  • 有效Java第二版
    • 第8项:服从总合同,当凌驾于
    • 第9项:重写等于时始终重写哈希代码
API链接
  • -此处不需要,但另一个重要的Java API合同
相关问题 在
equals/hashCode
组合中:

在<代码>上等于<代码>与<代码>=<代码>:


您还可以检查Arraylist,如下所示:

public  boolean equalLists(List<String> one, List<String> two){     
if (one == null && two == null){
    return true;
}

if((one == null && two != null) 
  || one != null && two == null
  || one.size() != two.size()){
    return false;
}

//to avoid messing the order of the lists we will use a copy
//as noted in comments by A. R. S.
one = new ArrayList<String>(one); 
two = new ArrayList<String>(two);   

Collections.sort(one);
Collections.sort(two);      
return one.equals(two);
}
公共布尔等式列表(列表一,列表二){
if(一==null&&two==null){
返回true;
}
如果((一==null和两!=null)
||一!=null&&two==null
||1.size()!=2.size()){
返回false;
}
//为了避免弄乱列表的顺序,我们将使用副本
//正如A.R.S.的评论所指出的。
一个=新阵列列表(一个);
二=新阵列列表(二);
集合。排序(一);
收藏。分类(二);
返回1。等于(2);
}

多亏了@Joachim Sauer在他的回答中提到的,如果列表是相等的,并且它们的内容正确地实现了equals,那么equals应该起作用。但是,如果项目不在相同的“顺序”中,它就不应该工作,因为它不使用contains进行检查。从这个意义上讲,它检查@jarnbjo提到的“严格”平等

        //From android's Arraylist implementation
        Iterator<?> it = that.iterator();
        for (int i = 0; i < s; i++) {
            Object eThis = a[i];
            Object eThat = it.next();
            if (eThis == null ? eThat != null : !eThis.equals(eThat)) {
                return false;
            }
        }
//来自android的Arraylist实现
Iterator it=that.Iterator();
对于(int i=0;i
然而,我想要一些不同的行为,我不在乎秩序或诸如此类的事情。我所要做的就是确保这两件物品不包含相同的物品。 我的解决方案

    //first check that both are not null and are of same length. (not shown here)
    //if both match, pull out the big guns as below
    ...
    List<Object> comparedList = new ArrayList<>(listOne);
    comparedList.removeAll(listTwo);
    if(comparedList.size() != 0) //there are differences between the two
//首先检查这两个值是否都不为null且长度相同。(此处未显示)
//如果两者都匹配,请按如下所示拔出大炮
...
List comparedList=新的ArrayList(listOne);
comparedList.removeAll(列表二);
if(comparedList.size()!=0)//两者之间存在差异
由于它循环两次,首先在
removeAll
中循环,然后在
contains
中循环,被
removeAll
调用,因此性能较低


我的列表肯定很短,所以我不介意点击。

这里有一个简单的方法来检查
 //the name of the method explains it well...
    public boolean isTwoArrayListsWithSameValues(ArrayList<Object> list1, ArrayList<Object> list2)
    {
        //null checking
        if(list1==null && list2==null)
            return true;
        if((list1 == null && list2 != null) || (list1 != null && list2 == null))
            return false;

        if(list1.size()!=list2.size())
            return false;
        for(Object itemList1: list1)
        {
            if(!list2.contains(itemList1))
                return false;
        }

        return true;
    }
list1.toString().equals(list2.toString())