Как отсортировать массив классов с несколькими полями в Java

#java #arrays #sorting

#java #массивы #сортировка

Вопрос:

У меня есть этот код, который запрашивает у пользователя названия книг, авторов и количество страниц и сохраняет их в массиве классов. Затем он спрашивает пользователя, как они хотели бы отсортировать книги. Код работает, но мой профессор сказал, что он может быть более эффективным при сортировке. К сожалению, в моей книге не рассматривается метод сравнения или коллекции до моего второго курса Java, поэтому я не могу их использовать. Мне нужно сделать так, чтобы в нем было меньше дублирования, но у меня совсем нет идей.

Вот текущий код:

 import javax.swing.*;
public class LibraryBookSort
{
   public static void main(String[] args)
   {
      String bookTitle, bookAuthor, bookPC, sortOption;
      String temp = "", temp2 = "", temp3 = "";
      int a, b, x;
      LibraryBook[] book = new LibraryBook[5];
      for(x = 0; x < book.length;   x)
      {
         bookTitle = JOptionPane.showInputDialog(null, "Please enter a book title:");
         bookAuthor = JOptionPane.showInputDialog(null, "Please enter the book's author:");
         bookPC = JOptionPane.showInputDialog(null, "Please enter the book's page count:");
         book[x] = new LibraryBook();
         book[x].setTitle(bookTitle);
         book[x].setAuthor(bookAuthor);
         book[x].setPageCount(bookPC);
      }
      sortOption = JOptionPane.showInputDialog(null, "How would you like the books to be sorted?"
           "nPress 1 to sort by title nPress 2 to sort by author nPress 3 to sort by page count");
      int comparisonsToMake = book.length - 1;
      switch(sortOption)
      {
         case "1":            
            for(a = 0; a < book.length - 1;   a)
            {
               for(b = 0; b < comparisonsToMake;   b)
               {
                  if(book[b].getTitle().compareTo(book[b   1].getTitle()) > 0)
                  {
                     temp = book[b   1].getTitle();
                     temp2 = book[b   1].getAuthor();
                     temp3 = book[b   1].getPageCount();
                     book[b   1].setTitle(book[b].getTitle());
                     book[b   1].setAuthor(book[b].getAuthor());
                     book[b   1].setPageCount(book[b].getPageCount());
                     book[b].setTitle(temp);
                     book[b].setAuthor(temp2);
                     book[b].setPageCount(temp3);
                  }
               }
               --comparisonsToMake;
            }
            break;
         case "2":
            for(a = 0; a < book.length - 1;   a)
            {
               for(b = 0; b < comparisonsToMake;   b)
               {
                  if(book[b].getAuthor().compareTo(book[b   1].getAuthor()) > 0)
                  {
                     temp = book[b   1].getTitle();
                     temp2 = book[b   1].getAuthor();
                     temp3 = book[b   1].getPageCount();
                     book[b   1].setTitle(book[b].getTitle());
                     book[b   1].setAuthor(book[b].getAuthor());
                     book[b   1].setPageCount(book[b].getPageCount());
                     book[b].setTitle(temp);
                     book[b].setAuthor(temp2);
                     book[b].setPageCount(temp3);
                  }
               }
               --comparisonsToMake;
            }
            break;
         case "3":            
            for(a = 0; a < book.length - 1;   a)
            {
               for(b = 0; b < comparisonsToMake;   b)
               {
                  if(book[b].getPageCount().compareTo(book[b   1].getPageCount()) > 0)
                  {
                     temp = book[b   1].getTitle();
                     temp2 = book[b   1].getAuthor();
                     temp3 = book[b   1].getPageCount();
                     book[b   1].setTitle(book[b].getTitle());
                     book[b   1].setAuthor(book[b].getAuthor());
                     book[b   1].setPageCount(book[b].getPageCount());
                     book[b].setTitle(temp);
                     book[b].setAuthor(temp2);
                     book[b].setPageCount(temp3);
                  }
               }
               --comparisonsToMake;
            }
            break;
         default:
            JOptionPane.showMessageDialog(null, "That is an invalid option."
                 "nThe books will not be sorted");
            break;
      }
      for(x = 0; x < book.length;   x)
         book[x].display();      
   }
}
  

у кого-нибудь есть какие-либо предложения?

Комментарии:

1. Если у вас есть рабочий код, по которому вы хотели бы получить советы по улучшению, Code Review SE может быть тем местом, на которое стоит обратить внимание.

2. Позвольте мне прояснить … вас просят выполнить обычную задачу, для которой уже существует хорошо продуманный и гибкий API, но вам запрещено использовать этот API, потому что он еще не изучен? Найдите другого учителя.

3. @BrodoFraggins Иногда полезно узнать, что лежит в основе этого API. Возможно, вам не понадобится реализовывать свой собственный алгоритм сортировки в будущем, но было бы неплохо узнать, как это делается. Иногда учителя не хотят, чтобы учащиеся использовали ярлыки, потому что тогда они могут пропустить основы, которые могут понадобиться позже.

4. вы можете поместить весь этот код внутри if в ваших случаях в отдельный метод, поскольку он в любом случае точно такой же

5. @user3580294 Обучение новичков тому, как реализовать свои собственные структуры данных и алгоритмы сортировки, только порождает идею о том, что они должны использовать свои собственные неполноценные специальные решения для всего. Да, я знаю, что почти каждая учебная программа CS начинается таким образом. Почти каждая учебная программа CS неверна! Новичков следует обучить навыкам реальной оценки существующих решений и выбора правильного для работы. Большая часть моей работы как профессионального программиста заключается в уборке после идиотов со степенями, которых этому никогда не учили.

Ответ №1:

если «может быть более эффективным при сортировке» означает меньше кода, инкапсулируйте

                  temp = book[b   1].getTitle();
                 temp2 = book[b   1].getAuthor();
                 temp3 = book[b   1].getPageCount();
                 book[b   1].setTitle(book[b].getTitle());
                 book[b   1].setAuthor(book[b].getAuthor());
                 book[b   1].setPageCount(book[b].getPageCount());
                 book[b].setTitle(temp);
                 book[b].setAuthor(temp2);
                 book[b].setPageCount(temp3);
  

как функция

если «может быть более эффективным» при сортировке означает сложность, используйте другой алгоритм сортировки

Комментарии:

1. Это не сделало бы его код более эффективным. Во всяком случае, обработка стека функции была бы (имейте в виду, небольшая сумма ) менее эффективной.

2. отредактировано для уточнения потенциально разных значений «более эффективного»

Ответ №2:

Похоже, вы используете алгоритм bubblesort, который имеет среднюю сложность O (n ^ 2). Я бы предложил заменить его быстрой сортировкой, которая имеет среднюю сложность O (nlogn).