PriorityQueue不按值排序映射

时间:2014-05-27 11:38:10

标签: java sorting hashmap priority-queue

我有一个简单的类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按值排序地图,但我不明白这里发生了什么......

1 个答案:

答案 0 :(得分:1)

如果你看到PriorityQueue Docs,你会看到,

方法iterator()中提供的迭代器不能保证以任何特定的顺序遍历优先级队列的元素。如果需要有序遍历,请考虑使用Arrays.sort(pq.toArray())。

  

队列检索操作轮询,删除,查看和元素访问队列的&gt;头部的元素。

因此,如果您使用poll或其他一些方法,您应该按顺序获取元素
为了获得整数的降序,您必须从

更改比较
return lhs.getValue().compareTo(rhs.getValue());

return rhs.getValue().compareTo(lhs.getValue());

因为第一个按自然顺序(从最小到最大)对数字进行排序