我正在尝试在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