如何使用自定义Comparator或equals方法查找Set设置差异?

时间:2016-06-22 00:20:59

标签: java set comparator

我希望找到两个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);
    }

}

这只是一个简单的例子来解释我正在尝试做什么,而不是我应用程序中的实际类。

我找到的两种可能的解决方案是

  1. 包装类并覆盖equals方法
  2. TreeSet与自定义比较器
  3. 一起使用

    到目前为止,我还有其他方法,这些解决方案的优缺点是什么?

1 个答案:

答案 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);
    }
}