如果我有一个包含两个数据变量的节点。
说
class HuffNode{
public char iData;
public int frequency;
public HuffNode leftChild;
public HuffNode rightChild;
// ---------------------------------------------------------
HuffNode(char d){
this.iData = d;
this.frequency = 0;
}
}
然后,我希望按每个节点的频率将它们按升序排列到优先级。
PriorityQueue<HuffNode> q = new PriorityQueue<HuffNode>();
Set<Character>keys = map.keySet(); //iterator
Iterator<Character> it = keys.iterator();
while(it.hasNext()){
char key = it.next();
HuffNode node = new HuffNode(key);
node.frequency = map.get(key);
q.add()// want to add by frequency
}
如果我只是将节点添加到que中,我认为节点将按字母顺序排列。如何将比较器更改为频率?
提前谢谢。
答案 0 :(得分:2)
Pass a Comparator as a constructor parameter,例如
new PriorityQueue<>(
initialCapacity,
new Comparator<HuffNode>() {
@Override public int compare(HuffNode a, HuffNode b) {
return Integer.compare(a.frequency, b.frequency);
}
});
请注意,您并不真正想要使用的东西来命令节点是可变的,特别是如果它是公共的 - 如果您要更改频率值,它将不会自动重新排序队列。
您可以尽可能多地制作final
字段。