Как связать несколько объектов в очередь - PullRequest
0 голосов
/ 08 сентября 2018

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

Спасибо за вашу помощь!

public class QueueClass {

protected static Queue<Object> Q = new LinkedList<>();

protected void addToQueue (String firstName, String lastName, int age) {
    String studentInfo = (firstName + " " + lastName + " " + age);

    Q.add(studentInfo);
}

protected void printAll () {

    @SuppressWarnings("resource")
    Scanner scnr  = new Scanner (System.in);

    String userInput  = " ";
    String age        = "A";
    String lastName   = "L";

    boolean quit = false;

    while (quit == false) {
        System.out.print("\nThe list will be printed in descending order. Would you like it printed ");
        System.out.print("in order of (A)ge or (L)ast name?\n");
        userInput = scnr.next();

        if (userInput.equalsIgnoreCase(age)) {
            //SortingClass.sortByAge();
            quit = true;
            continue; }

        else if (userInput.equalsIgnoreCase(lastName)) {
            //SortingClass.sortByLastName();
            quit = true;
            continue; }

        else {
            System.out.println("Please enter a valid choice."); }
    }


}

}

1 Ответ

0 голосов
/ 08 сентября 2018

Ваша большая ошибка - использовать String вместо действительного класса Java. Ваша очередь должна содержать не строки, а объекты класса ученика, один с полями lastName, firstName и age (или dateOfBirth). Тогда вам будет проще сделать сортировку по свойствам класса намного .

так нет:

protected static Queue<Object> Q = new LinkedList<>();

а точнее

protected static Queue<Student> Q = new LinkedList<>();

Где у Student есть строковые поля экземпляра для lastName, firstName, а также int для возраста (или, опять же, лучше Date или LocalDate для даты рождения).

например.,

public class Student {
    private String lastName;
    private String firstName;
    private int age;

    public Student(String lastName, String firstName, int age) {
        this.lastName = lastName;
        this.firstName = firstName;
        this.age = age;
    }

    public String getLastName() {
        return lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public int getAge() {
        return age;
    }

    // hashCode and equals overrides are not essential
    // but they can be helpful if you want to see
    // if your collection contains an object of interest

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((firstName == null) ? 0 : firstName.hashCode());
        result = prime * result + ((lastName == null) ? 0 : lastName.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Student other = (Student) obj;
        if (firstName == null) {
            if (other.firstName != null)
                return false;
        } else if (!firstName.equals(other.firstName))
            return false;
        if (lastName == null) {
            if (other.lastName != null)
                return false;
        } else if (!lastName.equals(other.lastName))
            return false;
        return true;
    }

    // You don't absolutely need a toString() method, but it makes printing out
    // your results a bit easier
    @Override
    public String toString() {
        return "Student [lastName=" + lastName + ", firstName=" + firstName + ", age=" + age + "]";
    }

}

Таким образом, вы можете сортировать, используя свойства каждого элемента в коллекции, например, с помощью Comparator.

Проверьте эту ссылку на String Obsession Anti-Pattern , чтобы узнать больше о том, почему вы хотите избегать использования строк, где допустимые объекты Java определенного класса будут работать лучше.

Примечания:

  • Избегайте использования <Object> в качестве универсального параметра, поскольку он полностью исключает любую выгоду от использования универсальных параметров.
  • Избегайте использования статических полей, если можете.
  • Избегайте логических выражений, таких как: while (quit == false) {. Это так легко испортить и вместо этого набрать while (quit = false) {, что приводит к совершенно другому поведению. Гораздо лучше, тем проще и элегантнее while (!quit) {
...