java interscect,union,join,带谓词的不同列表

你好我有2个包含相同对象的列表。 我想通过使用谓词来执行像intercesct,union和distinct这样的操作,因为我无法使用equals来进行比较。

例:

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

现在我有两个汽车列表。 我需要在此列表中查找重复项,但不能仅通过颜色来查找id。

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(new Car(2,green))找到第二个对象

列表类似于

Collection.intersect(carList1,carList2,comparator).

在C#中,我会为它使用LINQ。


你可以用类似的想法使用番石榴。

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

有一个名为Apache Functor Commons的库支持Predicates等。

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

其中一位评论者指出,还有番石榴:

http://code.google.com/p/guava-libraries/

你可以使用Comparator编写自己的代码,但只需使用其中一个库,就可以轻松完成交叉,联接等操作。

链接地址: http://www.djcxy.com/p/58209.html

上一篇: java interscect, union, join, distinct lists with predicate

下一篇: PhantomJs clicking links or running on