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

时间:2013-03-04 14:14:58

标签: java

我有两个需要比较的对象列表。对象具有名称属性,并且我想检查具有该名称的一个对象是否存在于另一个列表中。

我遇到了ListUtils.subtract方法,但我只看到人们使用Int或String等类型...

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

编辑:

Myclass{
    private String name;
    public getName(){
        return this.name;
    }

}

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

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

其中一个列表是使用一些SQL查询创建的。创建另一个检查服务器中的某些文件。这些列表中的对象数可以相同,或者一个或另一个可以有更多对象。

有没有办法获取一个列表中的对象,而不是另一个列表中的对象?

这样的事情:

List result = ListUtils.subract (list1,list2);

但使用名称属性。

4 个答案:

答案 0 :(得分:0)

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

那就是说,ListUtils.substract没有给你两个列表之间的交集。为此,您将使用ListUtils.retainAll。你也可以简单地使用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

覆盖equals并不总是切实可行,例如,如果您根据其他属性有不同的场景要进行比较。在这种情况下,您可以使用Guava library中的ComparatorCollections2.filter

答案 1 :(得分:0)

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

答案 2 :(得分:0)

你也可以使用比较器和可比较的。以下是http://www.digizol.com/2008/07/java-sorting-comparator-vs-comparable.html

的示例

答案 3 :(得分:-3)

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

我的thinlk覆盖等于解决问题但是是黑客

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


}