按尾部长度和字母顺序对列表进行排序



我应该编写一个排序列表的算法。该列表应按尾部长度排序。如果名单上的两只狗的尾巴长度相同,那么它们应该按字母顺序排列。

我有一个名为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"中处理整个数组可能会导致错误。

您应该执行以下操作之一:

  1. 使用"Collections.sort(("one_answers"Comparable"界面
  2. 按尾部长度对数组进行排序,然后再次迭代以对所有尾部长度相同的狗进行排序

最新更新