Java 使用一个对象属性比较两个对象列表

Java 使用一个对象属性比较两个对象列表,java,Java,我有两个需要比较的对象列表。这些对象的名称为atribute,我想检查另一个列表中是否存在一个具有该名称的对象 我遇到过ListUtils.subtract方法,但我只见过有人将其与Int或String等类型一起使用 它可以与自定义对象类型一起使用吗 编辑: 我有两个此对象类型的列表: List<MyClass> list1; List<MyClass> list2; 但是使用名称atribute。您可以在两个列表中使用ListUtils.subtract。要使其工作,

我有两个需要比较的对象列表。这些对象的名称为atribute,我想检查另一个列表中是否存在一个具有该名称的对象

我遇到过ListUtils.subtract方法,但我只见过有人将其与Int或String等类型一起使用

它可以与自定义对象类型一起使用吗

编辑:

我有两个此对象类型的列表:

List<MyClass> list1;
List<MyClass> list2;

但是使用名称atribute。

您可以在两个列表中使用ListUtils.subtract。要使其工作,必须定义自定义类的
equals
方法,当且仅当两个对象的name属性相同时,才能返回true

也就是说,
ListUtils.substract
不会给出两个列表之间的交集。为此,您可以使用
ListUtils.retainal
。您也可以简单地使用
List.retainAll
,但它会修改您的列表,而不是创建副本,因此您应该自己创建这样的副本

编辑:所以你们不想要交集,你们真的想要减法。这样很好,只需将对象的等号写为:

bool equals(Object other) {
    if (other==null || !other instanceof MyClass) {
        return false;
    }
    return name.equals(other.name); // assume name is never null. You can check for that
}
您还可以使用列表中的
Collection.removeAll


覆盖
等于
并不总是切实可行的,例如,如果您有不同的场景,需要根据其他属性进行比较。在这种情况下,您可以使用
比较器
Collections2.filter
from.

您可以将ListUtils.subtract与两个列表一起使用。要使其工作,必须定义自定义类的
equals
方法,当且仅当两个对象的name属性相同时,才能返回true

也就是说,
ListUtils.substract
不会给出两个列表之间的交集。为此,您可以使用
ListUtils.retainal
。您也可以简单地使用
List.retainAll
,但它会修改您的列表,而不是创建副本,因此您应该自己创建这样的副本

编辑:所以你们不想要交集,你们真的想要减法。这样很好,只需将对象的等号写为:

bool equals(Object other) {
    if (other==null || !other instanceof MyClass) {
        return false;
    }
    return name.equals(other.name); // assume name is never null. You can check for that
}
您还可以使用列表中的
Collection.removeAll

覆盖
等于
并不总是切实可行的,例如,如果您有不同的场景,需要根据其他属性进行比较。在这种情况下,您可以使用
比较器
Collections2.filter
from.

答案是没有rtf 你为什么不用谷歌自己找呢 为什么不使用ide来显示文档

我认为覆盖等于解决问题,但这是一个黑客

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {

    public static void main(String arg[]) {
        ArrayList<Dog> firstGroup = new ArrayList<Dog>();

        firstGroup.add(new Dog("Rintintin"));
        firstGroup.add(new Dog("Courage"));
        firstGroup.add(new Dog("Scooby-Dooby-Do"));

        ArrayList<Dog> secondGroup = new ArrayList<Dog>();

        secondGroup.add(new Dog("fido"));
        secondGroup.add(new Dog("Courage"));
        secondGroup.add(new Dog("Rintintin"));

        List<Dog> filterByName = filterByName(firstGroup,secondGroup);

        System.out.print(Arrays.toString(filterByName.toArray()));
    }

    private static List<Dog> filterByName(ArrayList<Dog> firstGroup, ArrayList<Dog> secondGroup) {
        List<Dog> result=new ArrayList<>();
        for (Dog orginal : firstGroup) 
            for (Dog finDog : secondGroup) 
                if(orginal.getName().equals(finDog.getName()))
                    result.add(new Dog(orginal.getName()));
        return result;
    }


}
import java.util.ArrayList;
导入java.util.array;
导入java.util.List;
公共班机{
公共静态void main(字符串arg[]){
ArrayList firstGroup=新的ArrayList();
添加(新狗(“rintin”);
第一组。添加(新狗(“勇气”);
添加(新狗(“史酷比·杜比”);
ArrayList secondGroup=新的ArrayList();
第二组。添加(新狗(“fido”));
第二组。添加(新狗(“勇气”);
第二组。添加(新狗(“rintin”);
List filterByName=filterByName(第一组,第二组);
System.out.print(Arrays.toString(filterByName.toArray());
}
专用静态列表筛选器ByName(ArrayList firstGroup,ArrayList secondGroup){
列表结果=新建ArrayList();
对于(犬源:第一组)
对于(狗查找犬:第二组)
if(original.getName().equals(finDog.getName()))
添加(新狗(original.getName());
返回结果;
}
}
答案是没有rtf 你为什么不用谷歌自己找呢 为什么不使用ide来显示文档

我认为覆盖等于解决问题,但这是一个黑客

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class Main {

    public static void main(String arg[]) {
        ArrayList<Dog> firstGroup = new ArrayList<Dog>();

        firstGroup.add(new Dog("Rintintin"));
        firstGroup.add(new Dog("Courage"));
        firstGroup.add(new Dog("Scooby-Dooby-Do"));

        ArrayList<Dog> secondGroup = new ArrayList<Dog>();

        secondGroup.add(new Dog("fido"));
        secondGroup.add(new Dog("Courage"));
        secondGroup.add(new Dog("Rintintin"));

        List<Dog> filterByName = filterByName(firstGroup,secondGroup);

        System.out.print(Arrays.toString(filterByName.toArray()));
    }

    private static List<Dog> filterByName(ArrayList<Dog> firstGroup, ArrayList<Dog> secondGroup) {
        List<Dog> result=new ArrayList<>();
        for (Dog orginal : firstGroup) 
            for (Dog finDog : secondGroup) 
                if(orginal.getName().equals(finDog.getName()))
                    result.add(new Dog(orginal.getName()));
        return result;
    }


}
import java.util.ArrayList;
导入java.util.array;
导入java.util.List;
公共班机{
公共静态void main(字符串arg[]){
ArrayList firstGroup=新的ArrayList();
添加(新狗(“rintin”);
第一组。添加(新狗(“勇气”);
添加(新狗(“史酷比·杜比”);
ArrayList secondGroup=新的ArrayList();
第二组。添加(新狗(“fido”));
第二组。添加(新狗(“勇气”);
第二组。添加(新狗(“rintin”);
List filterByName=filterByName(第一组,第二组);
System.out.print(Arrays.toString(filterByName.toArray());
}
专用静态列表筛选器ByName(ArrayList firstGroup,ArrayList secondGroup){
列表结果=新建ArrayList();
对于(犬源:第一组)
对于(狗查找犬:第二组)
if(original.getName().equals(finDog.getName()))
添加(新狗(original.getName());
返回结果;
}
}

使对象实现。在
compareTo()
方法中,根据name属性进行比较。

使对象实现。在
compareTo()
方法中,根据name属性进行比较。

您还可以使用comparator和comparable。下面是一个示例,您也可以使用comparator和comparable。下面是一个示例

代码。还要澄清这个问题。当两个对象在不同的列表中具有相同的名称时,您希望发生什么?重写
equals
方法?试过了吗?密码就好了。还要澄清这个问题。当两个对象在不同的列表中具有相同的名称时,您希望发生什么?重写
equals
方法?试过这个吗?