我有一个项目,其中有一个 Halfedge 类(olny .class 文件,所以无法修改它)。我想创建一个优先队列。为了确定哪个元素更大,我不仅需要 Halfedge 类中的字段,还需要我在代码中创建的 HashMap。
问题是:当我为 Halfedge 定义特定的 Comparator 类时,我不能包含任何参数。
我的问题是:如何使用外部参数为我的 Halfedge 类实现比较器类?(或者简单地说,我应该如何构造那个 PriorityQueue)
非常感谢!
我有一个项目,其中有一个 Halfedge 类(olny .class 文件,所以无法修改它)。我想创建一个优先队列。为了确定哪个元素更大,我不仅需要 Halfedge 类中的字段,还需要我在代码中创建的 HashMap。
问题是:当我为 Halfedge 定义特定的 Comparator 类时,我不能包含任何参数。
我的问题是:如何使用外部参数为我的 Halfedge 类实现比较器类?(或者简单地说,我应该如何构造那个 PriorityQueue)
非常感谢!
请看下面的代码:
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));
请注意,您可以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
- 如果发生这种情况 - 您的数据结构将被损坏并且您将获得未定义的行为。