我应该编写一个排序列表的算法。该列表应按尾部长度排序。如果名单上的两只狗的尾巴长度相同,那么它们应该按字母顺序排列。
我有一个名为getTailLength的方法,它返回狗的尾巴长度。这就是我迄今为止为排序算法所做的:
public void sortByName(ArrayList<Dog> allDogs) {
for (int i = 1; i < allDogs.size(); i++) {
String currentDogName = allDogs.get(i).getName();
// Dog dog = allDogs.get(i).getName();
// int currentDogNameIndex = i;
int j = i - 1;
while (j >= 0 && currentDogName
.compareTo(allDogs.get(j).getName()) < 0) {
allDogs.set(j + 1, allDogs.get(j));
j--;
}
allDogs.set(j + 1, currentDogName);
}
}
public void sortDogs(ArrayList<Dog> allDogs) {
for (int i = 1; i < allDogs.size(); i++) {
double currentMinTail = allDogs.get(i).getTailLength();
int currentMinTailIndex = i;
for (int j = i - 1; j < allDogs.size(); j++) {
if (currentMinTail > allDogs.get(j).getTailLength()) {
Collections.swap(allDogs, i, j);
} else if (currentMinTail == allDogs.get(i).getTailLength()) {
sortByName(allDogs);
}
}
}
}
问题出在这行代码上
allDogs.set(j + 1, currentDogName);
我不确定这里要改什么,因为它说Dog是必需的,但我在比较字符串,而不是dogs,因为我在比较名称?
如果不是练习,正确的方法是用以下单行替换sortDogs()
:
allDogs.sort(Comparator.comparingInt(Dog::getTailLength)
.thenComparing(Dog::getName));
您必须给allDogs.set(index, Dog)
一个Dog实例。
你比较字符串,但你仍然对狗进行排序。
使用allDogs.get(i).getName();
获得currentDogName
,我不会在例程中更改,所以只需将allDogs.set(j + 1, currentDogName);
替换为allDogs.set(j + 1, allDogs.get(i));
总的来说,你的功能看起来很混乱。在助手函数"sortByName"中处理整个数组可能会导致错误。
您应该执行以下操作之一:
- 使用"Collections.sort(("one_answers"Comparable"界面
- 按尾部长度对数组进行排序,然后再次迭代以对所有尾部长度相同的狗进行排序