java interterscect, union, join, отдельные списки с предикатом - PullRequest
7 голосов
/ 15 марта 2012

Здравствуйте, у меня есть 2 списка, которые содержат одинаковые объекты.Я хотел бы выполнить любую операцию, такую ​​как перехват, объединение, отличное, используя предикат, потому что я не могу использовать равно для сравнения.

Пример:

class Car{
  public String id;
  public String color;
  public int hashcode(){
    //id field is used for hashcode
  }
  public boolean equals(){
    //id field is used for equals
  }
}

Теперь у меня есть два списка машин,Мне нужно найти дубликаты в этих списках, но не по идентификатору, а только по цвету.

List<Car> carList1 = new ArrayList(){ new Car(1,blue), new Car(2,green)};
List<Car> carList2 = new ArrayList(){ new Car(1,silver), new Car(4,green)};

Мне нужно найти второй объект из carList1 (новый автомобиль (2, зеленый))

List Somethingпохоже на

Collection.intersect(carList1,carList2,comparator).

В C # я бы использовал для этого LINQ.

Ответы [ 2 ]

4 голосов
/ 15 марта 2012

Вы можете сделать то же самое, используя Гуава .

1) Пересечение - это операция над множествами, а не списками.Поэтому вы должны построить их как

final Set<Car> first = ImmutableSet.of( new Car(1, "blue"), new Car(2, "green") );

или, если вам нужен специальный компаратор (упомянутый предикат)

final Set<Car> second = newTreeSet( new Comparator<Car>(){
    public int compare( final Car o1, final Car o2 ){
        return o1.getColor().compare( o2.getColor() );  //return 0 when predicate return true
    }
} );
second.add( new Car(1, "green")  );

UPD: Вы должны использовать только один способпостроить оба набора.

Чем пересечение вызова

 final Set<Car> intersection = Sets.intersection( first, second );
0 голосов
/ 15 марта 2012

Для этого существует библиотека Apache Functor Commons, которая поддерживает предикаты и т. Д.

http://commons.apache.org/functor/

Существует также гуава, на которую один из комментаторов указал:1007 *http://code.google.com/p/guava-libraries/

Вы можете написать свой собственный, используя Comparator, но для таких вещей, как пересечение, соединение и т. Д. Проще использовать одну из этих библиотек.

...