2013-03-04 88 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()方法中,根據名稱屬性進行比較。