Список сортировки по длине хвоста и по алфавиту

Я должен написать алгоритм сортировки списка. Список должен быть отсортирован по длине хвоста. Если две собаки в списке имеют одинаковую длину хвоста, они должны быть отсортированы в алфавитном порядке.

У меня есть метод 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);

Я не уверен, что здесь изменить, поскольку там написано, что требуется собака, но я сравниваю строки, а не собак, поскольку я сравниваю имена?

# list arraylist sorting
Источник
  • 0
    Это выглядит слишком сложно. Вы рассматривали возможность использования интерфейса Comaparable?
  • 0
    Итак, я предполагаю, что вместо создания String currentDogName вы могли бы просто использовать сам объект dog, но каждый раз, используя текущий объект dog для сравнения его имени, используйте currentDog.getName()
  • 0
    Итак, я бы сказал, получите всю длину хвоста всех собак, поместите его в коллекцию, отсортируйте ее, а затем вызовите метод SortByName, думаю, это значительно упростит вашу работу.
Codelisting
за 0 против

Вам нужно будет передать экземпляр Dog вallDogs.set(index, Dog) .

Вы сравниваете строки, но все равно сортируете собак.

Ты получаешьcurrentDogName используяallDogs.get(i).getName(); я не буду менять распорядок дня, просто заменитеallDogs.set(j + 1, currentDogName); с участиемallDogs.set(j + 1, allDogs.get(i));

В целом ваши функции кажутся очень запутанными. Работа со всем массивом во вспомогательной функции ´sortByName´, вероятно, приведет к ошибкам.

Вместо этого вам следует выполнить одно из следующих действий:

  1. Используйте ´Collections.sort () ´ и интерфейс ´Comparable´
  2. Отсортируйте массив по длине хвоста, а затем повторите его итерацию, чтобы отсортировать всех собак с одинаковой длиной хвоста.
за 0 против

Если это не упражнение, правильный способ - заменитьsortDogs() с единственной строкой ниже:

allDogs.sort(Comparator.comparingInt(Dog::getTailLength)
                       .thenComparing(Dog::getName));
Codelisting
Популярные категории
На заметку программисту