使用两个用于排序的参数实现最小堆 [Java]



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

{ (停止, 3(, (任何地方, 1(, (食物, 17(, (得到, 3(, (完成, 1(}

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

{(任何地方, 1(, (完成, 1(, (得到, 3(, (停止, 3(, (食物, 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,您的解决方案奏效了!

你只需要这样更新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 =< 我们需要处理=的情况,所以如果值相等,那么我们将 String 与 compareTo() 方法进行比较,如果第一个字符串大于第二个字符串,该方法将返回>0

最新更新