Java - 对Comparators感到困惑,需要使用一个(我认为)。里面有更多信息

时间:2012-02-13 02:11:06

标签: java comparator

我创建了一个名为Foo的类。 Foo有三个字段,都是整数:x,y和z。我想创建一个PriorityQueue<Foo>,它在不同的情况下以不同的方式区分Foo对象的优先级。例如,我可能想要按x值,或者可能是y值,或者可能是z来区分优先级。但是我不知道在运行时要优先考虑哪个值。我听说你可以使用比较器以某种方式实现动态排序,我认为这在这里是完美的。

我很困惑,但我到底该如何做到这一点。有人可以告诉我一个例子,如果我想使用比较器优先考虑x(不必覆盖我的Foo类中的compareTo函数)吗?

非常感谢。

2 个答案:

答案 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等 最后,在运行时,您可以使用该比较器

实例化PriorityQueue
PriorityQueue<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);

...