2

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

我遇到了 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

4 回答 4

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,例如,如果您有不同的场景要根据其他属性进行比较。在这种情况下,您可以使用Comparatorand Collections2.filterfrom Guava library

于 2013-03-04T14:18:25.600 回答
0

您还可以使用比较器和比较器。这是一个示例http://www.digizol.com/2008/07/java-sorting-comparator-vs-comparable.html

于 2013-03-04T14:30:29.603 回答
0

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

于 2013-03-04T14:25:32.340 回答
-3

答案是no rtf 为什么不用google自己找 为什么不用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;
    }


}
于 2013-03-04T14:25:24.373 回答