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