我需要编写一个比较器,它采用类型A的对象A和类型B的对象B。这两个对象不是公共对象的扩展。它们确实有所不同,但是我需要通过其中的通用字段来比较这两个对象。我必须使用比较器接口,因为对象存储在Set中,而在我必须对CollectionUtils执行操作之后。我在Google上搜索了一下,找到了Comparator的解决方案,但只有相同的类型。

我试图朝这个方向实施思考,但我不知道自己是否正确。

public class MyComparator implements Comparator<A>, Serializable {

  private B b;

  public MyComparator(B b){
       this.b = b;
  }

  @Override
  public int compare(A old, A otherOne) {
    int value = 0;
    if (!old.getField().equals(b.getField())) {
        value = 1;
    }
    return value;
  }
}


可能总是会给出答案,但我没有在Google中找到合适的词来搜索。有建议吗?

Txs

PS:我将两个对象添加到不同的集中:之后我会这样想:

TreeSet<A> setA = new TreeSet<A>(myComparator);
TreeSet<B> setB = new TreeSet<B>(myComparator);


评论

在这里问类似的问题。 stackoverflow.com/questions/12414288/…

您希望如何使用该比较器?我能想到的所有带有比较器参数的东西都在处理单个类型...

#1 楼

有一种非常骇人听闻的方法,允许您使用Objectinstanceof,但是如果您可以实现公开特定接口的代理类,则最好这样做。

class A {

    public String getSomething() {
        return "A";
    }
}

class B {

    public String getSomethingElse() {
        return "B";
    }
}

class C implements Comparator<Object> {

    @Override
    public int compare(Object o1, Object o2) {
        // Which is of what type?
        A a1 = o1 instanceof A ? (A) o1: null;
        A a2 = o2 instanceof A ? (A) o2: null;
        B b1 = o1 instanceof B ? (B) o1: null;
        B b2 = o2 instanceof B ? (B) o2: null;
        // Pull out their values.
        String s1 = a1 != null ? a1.getSomething(): b1 != null ? b1.getSomethingElse(): null;
        String s2 = a2 != null ? a2.getSomething(): b2 != null ? b2.getSomethingElse(): null;
        // Compare them.
        return s1 != null ? s1.compareTo(s2): 0;
    }

}


更可接受的机制是为每个实现通用接口tyhat的代理实现一个代理类,然后可以使用适当的类型安全的比较器进行比较。


评论


Txs。最后,我决定采用界面方式。我没有尝试破解,而是为提案打了招呼。

–java4fun
2015年2月17日下午5:51

如何调用PA和PB对象的compare方法?

–拉耶什瓦尔
11月5日在1:57



#2 楼

如果将两个不相关类型的对象存储在Set中(这使我感到奇怪,因为Set通常是无序的),这意味着您使用的是原始Set,这不是非常安全的类型。

您可以定义接口CommonAB,其中包含AB的所有常用属性的吸气剂方法。 AB都将实现该接口。您可以将AB的实例放入Set<CommonAB>中。

最后,Comparator<CommonAB>将能够比较这两种类型的对象。 Comparator将仅访问该接口的方法。它不在乎是比较两个As,两个B还是一个A和一个B。

评论


我看到了这种方式,但这是唯一的方式吗?因为我不会再添加一个对象,所以我不得不再维护它。

–java4fun
15年2月16日在10:17