2

我有一个项目,其中有一个 Halfedge 类(olny .class 文件,所以无法修改它)。我想创建一个优先队列。为了确定哪个元素更大,我不仅需要 Halfedge 类中的字段,还需要我在代码中创建的 HashMap。

问题是:当我为 Halfedge 定义特定的 Comparator 类时,我不能包含任何参数。

我的问题是:如何使用外部参数为我的 Halfedge 类实现比较器类?(或者简单地说,我应该如何构造那个 PriorityQueue)

非常感谢!

4

2 回答 2

4

请看下面的代码:

public class HalfedgeComparator
        implements Comparator<Halfedge>;
{

  Object param1 = null;

  public HalfedgeComparator (Object param1) {
    this.param1= param1;
  }

  public int compare(Halfedge item1, Halfedge item2)
  {
    return ...;
     //your logic here where you can use the param1 passed in the constructor
  }
}

客户端代码可能是:

Collections.sort(yourListHere, new HalfedgeComparator(yourExternalParamHere));
于 2012-11-12T23:10:19.467 回答
4

请注意,您可以final从匿名内部类访问变量,并且可以根据需要使用它。

这是一个简单的例子:

public static void main(String args[]) {
    final Map<String,Integer> map = new HashMap<>();
    String s1 = "a";
    String s2 = "b";
    String s3 = "c";
    map.put(s2, 1);
    map.put(s1, 2);
    map.put(s3, 3);
    PriorityQueue<String> pq = new PriorityQueue<>(3, new Comparator<String>() {

        @Override
        public int compare(String o1, String o2) {
            return map.get(o1).compareTo(map.get(o2));
        }
    });
    pq.add(s1);
    pq.add(s2);
    pq.add(s3);
    while (pq.isEmpty() == false) 
        System.out.println(pq.poll());
}

请注意,该Comparator对象正在使用map局部变量。之所以可以这样做,是因为map声明了变量final


Map另一种方法是在 的构造函数中传递对 的引用Comparator(如果它不是匿名内部类),将其存储为字段并稍后使用。


在任何情况下 - 您必须确保Map某个元素中的数据在元素插入后不会更改PriorityQueue- 如果发生这种情况 - 您的数据结构将被损坏并且您将获得未定义的行为。

于 2012-11-12T23:17:14.957 回答