【问题标题】:PriorityQueue not sorting map by valuePriorityQueue 不按值排序地图
【发布时间】:2014-05-27 11:38:10
【问题描述】:

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

【问题讨论】:

标签: java sorting hashmap priority-queue


【解决方案1】:

如果您查看PriorityQueue Docs,您会看到,

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

队列检索操作 poll、remove、peek 和 element 访问队列头部的元素。

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

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

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

因为第一个按自然顺序排列数字(从小到大)

【讨论】:

  • 我正在使用 poll()。 poll() 应该返回 2 值条目。头部元素应该是最大的。
  • 那是因为您的比较器使用数字的自然顺序
  • 我应该按顺序排列元素,但我没有。正如我所说,这不是我第一次使用这种方法(使用 Double 而不是 Integer),而且效果很好!
  • 我已经编辑了我的答案,请查看两个返回语句并调整你的
  • 更改为返回 rhs.getValue().compareTo(lhs.getValue());工作。谢谢大佬!
猜你喜欢
  • 2013-01-06
  • 2021-01-20
  • 2012-12-04
  • 1970-01-01
  • 2012-04-25
  • 2011-07-24
  • 2020-12-13
  • 2020-08-19
  • 1970-01-01
相关资源
最近更新 更多