Я должен написать алгоритм сортировки списка. Список должен быть отсортирован по длине хвоста. Если две собаки в списке имеют одинаковую длину хвоста, они должны быть отсортированы в алфавитном порядке.
У меня есть метод 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 вallDogs.set(index, Dog)
.
Вы сравниваете строки, но все равно сортируете собак.
Ты получаешьcurrentDogName
используяallDogs.get(i).getName();
я не буду менять распорядок дня, просто заменитеallDogs.set(j + 1, currentDogName);
с участиемallDogs.set(j + 1, allDogs.get(i));
В целом ваши функции кажутся очень запутанными. Работа со всем массивом во вспомогательной функции ´sortByName´, вероятно, приведет к ошибкам.
Вместо этого вам следует выполнить одно из следующих действий:
Если это не упражнение, правильный способ - заменитьsortDogs()
с единственной строкой ниже:
allDogs.sort(Comparator.comparingInt(Dog::getTailLength)
.thenComparing(Dog::getName));
String currentDogName
вы могли бы просто использовать сам объект dog, но каждый раз, используя текущий объект dog для сравнения его имени, используйтеcurrentDog.getName()
Therabidpanther