我希望找到两个Set<T>
之间的差异,使用与T
类使用的不同的相等度量标准,例如自定义Comparator<T>
例如,我有一个类Animal
,它通常使用Animal
public class Animal {
public String species;
public String genus;
public Animal(String species, String genus){
this.species = species;
this.genus = genus;
}
public boolean equals(Animal other){
return other.species.equals(this.species);
}
}
我有两个List<Animal>
,我想在两个列表之间找到共享属的交集。
通常,我会将List
转换为Set
并使用retainAll
来查找交叉点。但是在这里,这将给出共享物种的交集,而不是共享物种。
我想使用GenusComparator
之类的东西来定义交集的相等性。
public class GenusComparator implements Comparator<Animal>{
@Override
public int compare(Animal animal1, Animal animal2) {
return String.CASE_INSENSITIVE_ORDER.compare(animal1.genus, animal2.genus);
}
}
这只是一个简单的例子来解释我正在尝试做什么,而不是我应用程序中的实际类。
我找到的两种可能的解决方案是
TreeSet
与自定义比较器到目前为止,我还有其他方法,这些解决方案的优缺点是什么?
答案 0 :(得分:1)
最简单的方法是使用IntentService
简单地使用TreeSet
。
您必须将这两个集转换为GenusComparator
才能使TreeSet(GenusComparator)
正常工作。
我修复了retainAll()
并添加了equals()
和hashCode()
。
toString()
输出
public class Test {
public static void main(String[] args) {
Set<Animal> set1 = new HashSet<>(Arrays.asList(new Animal("Jaguar", "Panthera"),
new Animal("Margay", "Leopardus"),
new Animal("Tiger", "Panthera")));
Set<Animal> set2 = new HashSet<>(Arrays.asList(new Animal("Bobcat", "Lynx"),
new Animal("Cougar", "Puma"),
new Animal("Leopard", "Panthera")));
TreeSet<Animal> treeSet1 = new TreeSet<>(new GenusComparator());
treeSet1.addAll(set1);
TreeSet<Animal> treeSet2 = new TreeSet<>(new GenusComparator());
treeSet2.addAll(set2);
treeSet1.retainAll(treeSet2);
System.out.println(treeSet1);
}
}
class Animal {
public String species;
public String genus;
public Animal(String species, String genus) {
this.species = species;
this.genus = genus;
}
@Override
public boolean equals(Object obj) {
return obj instanceof Animal && this.species.equals(((Animal)obj).species);
}
@Override
public int hashCode() {
return this.species.hashCode();
}
@Override
public String toString() {
return this.species + "/" + this.genus;
}
}
class GenusComparator implements Comparator<Animal> {
@Override
public int compare(Animal animal1, Animal animal2) {
return String.CASE_INSENSITIVE_ORDER.compare(animal1.genus, animal2.genus);
}
}