您好我有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找到第二个对象(新车(2,绿色))
列出与
类似的内容Collection.intersect(carList1,carList2,comparator).
在C#中我会用它来LINQ。
答案 0 :(得分:4)
您可以使用Guava进行类似的思考。
1)intersect是对集合的操作,而不是列表上的操作。所以你应该像
那样构建它们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 );
答案 1 :(得分:0)
有一个名为Apache Functor Commons的库,它支持Predicates等。
http://commons.apache.org/functor/
还有其中一位评论者指出的番石榴:
http://code.google.com/p/guava-libraries/
您可以使用Comparator编写自己的,但是要做像交叉,连接等操作,只需使用其中一个库就可以了。