我创建了一个名为Foo的类。 Foo有三个字段,都是整数:x,y和z。我想创建一个PriorityQueue<Foo>
,它在不同的情况下以不同的方式区分Foo对象的优先级。例如,我可能想要按x值,或者可能是y值,或者可能是z来区分优先级。但是我不知道在运行时要优先考虑哪个值。我听说你可以使用比较器以某种方式实现动态排序,我认为这在这里是完美的。
我很困惑,但我到底该如何做到这一点。有人可以告诉我一个例子,如果我想使用比较器优先考虑x(不必覆盖我的Foo类中的compareTo函数)吗?
非常感谢。
答案 0 :(得分:3)
比较器是一个参数化接口,允许您定义如何比较参数化类型的两个实例。我们假设你有以下课程
class Foo {
int x;
int y;
int z;
}
然后定义一个比较器,根据它们的x值对元素进行排序,然后是y,然后我们将执行以下操作
class XyzComparator implements Comparator<Foo> {
@Override
public int compare(Foo foo1, Foo foo2) {
if(foo1.x != foo2.x) {
return Integer.compare(foo1.x, foo2.x);
}
if(foo1.y != foo2.y) {
return Integer.compare(foo1.y, foo2.y);
}
return Integer.compare(foo1.z, foo2.z);
}
}
类似地,您可以定义比较元素的编译器,首先根据它们的y值比较x ... z等 最后,在运行时,您可以使用该比较器
实例化PriorityQueuePriorityQueue<Foo> queue;
if(x_then_y_then_z) {
queue = new PriorityQueue<Foo>(10, new XyzComparator());
} else if (y_then_x_then_z) {
queue = new PriorityQueue<Foo>(10, new ZxyComparator());
}
有关详细信息,请查看priority queue javadoc以及comparator javadoc
编辑:请参阅@buritos关于整数溢出的评论。
答案 1 :(得分:1)
Comparator<Foo> comparator = new Comparator<Foo>() {
@Override
public int compare(Foo o1, Foo o2) {
if (o1.x > o2.x)
return 1;
else if(o1.x < o2.x)
return -1;
else
return 0;
}
};
PriorityQueue<Foo> queue = new PriorityQueue<Foo>(10, comparator);
...