2015-10-15 49 views
1

我有兩個Foo集合。我無法更改Foo的實現,而Foo的equals函數執行不正確。我也不能從Foo繼承。我做自定義相等函數:我已經實現了使用番石榴的Predicate函數。爲了給你一個想法,實現看起來有點像這樣。使用自定義相等函數檢查兩個集合是否相同(忽略順序)

new Predicate<Pair<Foo, Foo>>() { 
     @Override 
     public boolean apply(@Nullable Pair<Foo, Foo> input) { 
      Foo one = input.getFirst(); 
      Foo two = input.getSecond(); 
      return Objects.equals(one.getId(), two.getId()); 
     } 
     }; 

現在,我需要檢查,如果我富的兩個集合包含相同的項目忽略使用此自定義功能的平等我正在尋找最好的方式順序

做到這一點。

+1

您可以使用集嗎?否則,你可以從list1中檢查list2'containsAll'項目,反之亦然。 – mvd

+0

我知道的Set的任何實現都使用equals函數來實現相等。如果有一個實現set的地方,你可以定義一個自定義相等函數,就像我使用的那個(或類似的)函數那麼這將是一個很好的解決方案 – Hendrik

回答

5

你可以包裝類的番石榴Equivalence和存儲的設置。

Equivalence<Foo> eq = new Equivalence<Foo>{ 
// implement equals and hashcode 
}; 
Set<Equivalence<Foo>> set1 = new HashSet<>(); 
set1.add(eq.wrap(someFoo)); 

這樣,你可以做一個雙向containsAll()或做

Sets.difference(set1, set2).isEmpty() 
+0

哦,這個等價類看起來非常有前途:) – Hendrik

1

而不是自定義Predicate,爲什麼不是一個簡單的SortedSet與自定義Comparator

Comparator<Foo> comparator = new Comparator<Foo>() { 

     public int compare(Foo o1, Foo o2) { 
      return //your custom comparison 
     } 
    }; 
    SortedSet<Foo> sortedSet1 = newTreeSet(comparator); 
    sortedSet1.addAll(firstCollection); 
    SortedSet<Foo> sortedSet2 = newTreeSet(comparator); 
    sortedSet2.addAll(secondCollection); 

    sortedSet1.equals(sortedSet); //this is what you want 
+0

儘管這應該在技術上起作用,但它違反了Comparator的合同,它暗示0如果兩個對象相等則返回 –

-1

如果你不希望有手術後排序列表,複製或使用答案與Set(但Set [1,1,1] == [1])。

public class ListTest { 
    public static void main(String[] args) { 
     List<Integer> list1 = Arrays.asList(1, 2, 3, 4, 5); 
     List<Integer> list2 = Arrays.asList(1, 2, 3, 4, 5); 
     List<Integer> list3 = Arrays.asList(1, 2, 3, 4, 4); 

     System.out.println(compare(list1, list2, (a, b) -> a - b)); 
     System.out.println(compare(list1, list3, (a, b) -> a - b)); 
    } 

    private static <E> boolean compare(List<E> list1, List<E> list2, Comparator<E> comparator) { 
     if(list1.size() != list2.size()) { 
      return false; 
     } 
     Collections.sort(list1, comparator); 
     Collections.sort(list2, comparator); 
     Iterator<E> iterator1 = list1.iterator(); 
     Iterator<E> iterator2 = list2.iterator(); 
     while (iterator1.hasNext()) { 
      if(comparator.compare(iterator1.next(), iterator2.next()) != 0) { 
       return false; 
      } 
     } 
     return true; 
    } 
}