作者:erryeg_342 | 来源:互联网 | 2023-09-08 12:07
我正在尝试在Java中实现一个最小堆,该堆基于两个参数进行排序。最小堆的每个元素都是一个对象,其中包含一个int和一个字符串。我当前的实现仅基于整数进行排序,但我还需要按字母顺序对其进行排序。例如,如果对象的内容如下:
{(已停止,3),(任何地方,1),(食物,17),(得到,3),(已完成,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 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值是否更大,如果是,则结束于此,否则,则应该为=
或<
,我们需要注意{ {1}}的情况,因此,如果值相等,则我们将String与=
方法进行比较,如果第一个String大于第二个String,则返回compareTo()