我试图朝这个方向实施思考,但我不知道自己是否正确。
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);
#1 楼
有一种非常骇人听闻的方法,允许您使用Object
和instanceof
,但是如果您可以实现公开特定接口的代理类,则最好这样做。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
,其中包含A
和B
的所有常用属性的吸气剂方法。 A
和B
都将实现该接口。您可以将A
和B
的实例放入Set<CommonAB>
中。最后,
Comparator<CommonAB>
将能够比较这两种类型的对象。 Comparator
将仅访问该接口的方法。它不在乎是比较两个As,两个B还是一个A和一个B。评论
我看到了这种方式,但这是唯一的方式吗?因为我不会再添加一个对象,所以我不得不再维护它。
–java4fun
15年2月16日在10:17
评论
在这里问类似的问题。 stackoverflow.com/questions/12414288/…您希望如何使用该比较器?我能想到的所有带有比较器参数的东西都在处理单个类型...