PriorityQueue带有外部参数

时间:2012-11-12 23:05:35

标签: java

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

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

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

非常感谢!

2 个答案:

答案 0 :(得分: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));

答案 1 :(得分:3)

请注意,您可以从匿名内部类访问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中的数据不会更改 - 如果它发生 - 您的数据结构将被破坏并且你将得到一个未定义的行为。