【问题标题】:Implementation of min Heap with two parameters for sorting [Java]带两个参数进行排序的min Heap的实现[Java]
【发布时间】:2019-11-22 05:59:08
【问题描述】:

我正在尝试在 java 中实现一个基于两个参数排序的最小堆。最小堆的每个元素都是一个包含一个 int 和一个字符串的对象。我当前的实现仅基于整数排序,但我还需要它按字母顺序排序。例如,如果对象的内容如下:

{ (stopped, 3), (anywhere, 1), (food, 17), (get, 3), (done, 1)}

从堆中删除元素时的输出必须是:

{(anywhere, 1), (done, 1), (get, 3), (stopped, 3), (food, 17)}

我的水槽和游泳功能描述如下:

 private void swim(int n){
        while (n > 1 && greater(n/2, n)){
            exchange(n, n/2);
            n = n/2;
        }
    }
 private boolean greater(int i, int j){
        return elements[i].getValue() >= elements[j].getValue();
    }
    private void exchange(int i, int j){
        Node tmp = elements[i];
        elements[i] = elements[j];
        elements[j] = tmp;
    }
    private void sink(int k){
        while(2*k <=n){
            int i = 2*k;
            if(i < n && greater(i, i+1)) i++;
            if(!greater(k,i)) break;
            exchange(k,i);
            k = i;
        }
    }

任何帮助将不胜感激!

更新

非常感谢@AlbertoSinigaglia,您的解决方案奏效了!

【问题讨论】:

  • 所以要澄清一下,您想先按字母顺序排序,然后按数字排序?如果您在示例中包含一些字符串关联(重复),这将有所帮助
  • 这种排序到底是什么? {(anywhere, 1), (done, 1), (get, 3), (stopped, 1), (food, 17)}?它既不是字母也不是数字
  • @sleepToken 正确。我想先按字母顺序排序,然后再按数字排序。因此,任何地方的第一个字母在完成的第一个字母之前,因此任何地方都在前面。这将在整个列表中继续进行,直到找到更大的数字。
  • @AlbertoSinigaglia 为错误道歉。它应该是:{(anywhere, 1), (done, 1), (get, 3), (stopped, 3), (food, 17)} 。我会进行编辑
  • 更好地使用elements[i].getValue()>elements[j].getValue || (elements[i].getValue()==elements[j].getValue() && elements[i].getString().compareTo(elements[j].getString())>0)

标签: java sorting priority-queue


【解决方案1】:

你只需要这样更新greater方法:

return /*1*/ elements[i].getValue()>elements[j].getValue 
           || 
         /*2*/ (elements[i].getValue()==elements[j].getValue() && elements[i].getString().compareTo(elements[j].getString())>0)

使用 1 检查 int 值是否更大,如果是,则结束,否则,它应该是 o =&lt;,我们需要处理 = 的情况,所以如果值相等,那么我们将字符串与compareTo() 方法进行比较,如果第一个字符串大于第二个字符串,它将返回&gt;0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2011-07-27
    • 1970-01-01
    • 2018-10-23
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多