2013-03-04 95 views
2

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

我整个ListUtils.subtract方法来了,但我只看到使用它与类型如int或字符串的人......

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

编辑:

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

} 

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

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

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

有没有办法让在一个列表中的对象,而不是在其他目录?

事情是这样的:

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

但使用的名称属性附加伤害。

+0

代码请... ...! – Lion 2013-03-04 14:16:06

+0

代码会很好。还澄清了这个问题。当两个对象在不同列表中具有相同名称时,您希望发生什么? – christopher 2013-03-04 14:16:27

+0

重写'equals'方法?试过这个? – SudoRahul 2013-03-04 14:16:52

回答

0

您可以在两个列表中使用ListUtils.subtract。为了使它起作用,当且仅当两个对象的name属性相同时,你必须定义自定义类的equals方法返回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

-3

答案是否定的RTF 为什么你不使用谷歌自己找到它 为什么你不使用IDE向您展示的文档

我thinlk覆盖equals方法解决这个问题,但一个是hack

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


} 
0

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