我有一个简单的类Cell:
public class Cell {
private int row, column;
public Cell(int row, int column) {
this.row = row;
this.column = column;
}
public void setRow(int row) {
this.row = row;
}
public void setColumn(int column) {
this.column = column;
}
public int getRow() {
return row;
}
public int getColumn() {
return column;
}
@Override
public String toString() {
return "[" + row + "," + column + "]";
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + column;
result = prime * result + row;
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Cell other = (Cell) obj;
if (column != other.column)
return false;
if (row != other.row)
return false;
return true;
}
}
我创建了一个HashMap。现在,我想按价值对其进行排序。这是我的方法:
PriorityQueue<Entry<Cell, Integer>> sortedCells = new PriorityQueue<Map.Entry<Cell, Integer>>(cells.size(), new CompareByValue());
sortedCells.addAll(cells.entrySet());
和CompareByValue是一个比较器:
private class CompareByValue implements Comparator<Map.Entry<Cell, Integer>> {
@Override
public int compare(Entry<Cell, Integer> lhs,
Entry<Cell, Integer> rhs) {
return lhs.getValue().compareTo(rhs.getValue());
}
}
这entrySet
:
{[1,2]=1, [1,0]=2, [2,1]=1, [-1,0]=1, [-1,1]=1, [0,2]=1, [0,-1]=1}
返回此PriorityQueue
:
[[1,2]=1, [-1,0]=1, [2,1]=1, [1,0]=2, [-1,1]=1, [0,2]=1, [0,-1]=1]
为什么不按值排序?我想要这样的东西:
[[1,0]=2, [1,2]=1, [-1,0]=1, [2,1]=1, [-1,1]=1, [0,2]=1, [0,-1]=1]
这不是我第一次使用PriorityQueue
按值排序地图,但我不明白这里发生了什么......
答案 0 :(得分:1)
如果你看到PriorityQueue Docs,你会看到,
方法iterator()中提供的迭代器不能保证以任何特定的顺序遍历优先级队列的元素。如果需要有序遍历,请考虑使用Arrays.sort(pq.toArray())。但
队列检索操作轮询,删除,查看和元素访问队列的&gt;头部的元素。
因此,如果您使用poll或其他一些方法,您应该按顺序获取元素
为了获得整数的降序,您必须从
return lhs.getValue().compareTo(rhs.getValue());
到
return rhs.getValue().compareTo(lhs.getValue());
因为第一个按自然顺序(从最小到最大)对数字进行排序