Сортировать arraylist по double и String

Нам дали задание:

  • отсортировать список массивов по длине хвоста собаки (двойной)
  • если две или более собак имеют одинаковую длину хвоста, отсортируйте их по именам

Я смог создать код, НО правильные результаты не отображаются при первой распечатке. Я должен попробовать еще раз, чтобы сортировка действительно произошла.

Я очень новичок в программировании, и это меня смущает. Любые идеи? Спасибо!

private void listDogs() {
    boolean length = false;
    for (int i = 0; i < dogs.size(); i++) {
        length = true;
    }
    if (dogs.isEmpty()) {
        System.out.println("Error: no dogs in register");

    }else {
        System.out.println("Please enter the tail lenght minimum: ");
        double tailLength = scan.nextDouble();
        scan.nextLine();

        Collections.sort(dogs);
        for (int i = 0; i < dogs.size(); i++) {
            if (dogs.get(i).getTailLength() >= tailLength) {
                System.out.println(dogs.get(i));
                length = true;
            }
        }
        if (length == false) {
                System.out.println("Error: No dog is registered with this tail length.");   
        }       

@Override
public int compareTo(Dog o) {
    // TODO Auto-generated method stub
    int compare = Double.compare(tailLength, o.tailLength);   
    if (compare == 0) {
        compare = Double.compare(tailLength, o.tailLength);    
    }
    if (compare == 0) {
        compare = name.compareTo(o.name);
    }
    return compare;
}

Метод compareTo выглядит нормально (кроме первых 3 строк, удалите их). Вы можете написать несколько тестов, чтобы убедиться, что он работает. Проблема может быть где-то еще, например. if (dogs.get(i).getTailLength() >= tailLength) { выглядит потенциально подозрительно.

Moritz Petersen 12.02.2019 15:39
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
470
2

Ответы 2

Я не уверен, решит ли это вашу проблему, но у вас есть

scan.nextLine();

в вашем коде, и я не понимаю, должно ли это быть там, потому что, насколько я знаю, он только ждет, пока вы что-то введете, а затем даже не сохраняет его в переменной. Поэтому вы можете удалить эту строку (строка 12).

Это использование новой строки, оставшейся в буфере после ввода номера для nextDouble(). Это плохой дизайн, вместо него нужно было использовать Double.parseDouble(scan.nextLine());, но это правильно.

Zabuzard 12.02.2019 15:45

Хотя ваш комментарий неплохой, это определенно не ответ на вопрос ОП, а скорее комментарий. Предлагаю удалить, смотрите Как ответить, спасибо.

Zabuzard 12.02.2019 15:46

Вы попробуете это?

import java.util.ArrayList;
import java.util.Collections;

public class Dog implements Comparable<Dog> {

    private double tailLength;
    private String name;

    public Dog(final double _tailLength, final String _name) {
        tailLength = _tailLength;
        name = _name;
    }

    @Override
    public String toString() {
        return "Dog [tailLength = " + tailLength + ", name = " + name + "]";
    }

    @Override
    public int compareTo(final Dog o) {
        int res = Double.compare(tailLength, o.getTailLength());
        if (res == 0) {
            res = name.compareTo(o.getName());
        }
        return res;
    }

    public double getTailLength() {
        return tailLength;
    }

    public void setTailLength(final double tailLength) {
        this.tailLength = tailLength;
    }

    public String getName() {
        return name;
    }

    public void setName(final String name) {
        this.name = name;
    }

    public static void main(final String[] args) {
        final ArrayList<Dog> dogs = new ArrayList<Dog>();
        dogs.add(new Dog(2, "Dog D"));
        dogs.add(new Dog(2, "Dog A"));
        dogs.add(new Dog(5, "Dog C"));
        dogs.add(new Dog(4, "Dog A"));
        dogs.add(new Dog(3, "Dog A"));
        dogs.add(new Dog(3, "Dog B"));
        dogs.add(new Dog(1, "Dog A"));

        // Sort Dog by tailLength and name
        Collections.sort(dogs);

        final Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("tailLength: ");
            final double inputTaillength = sc.nextDouble();
            for (final Dog dog : dogs) {
                if (dog.tailLength == inputTaillength) {
                    System.out.println(dog);
                }
            }

        }
    }
}

Другие вопросы по теме