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