【问题标题】:How to sort a class array with multiple fields in java如何在java中对具有多个字段的类数组进行排序
【发布时间】:2014-06-27 20:12:28
【问题描述】:

我有这段代码询问用户书名、作者和页数,并将它们存储在类数组中。然后它会询问用户他们希望如何对书籍进行排序。该代码有效,但我的教授说它可以更有效地进行排序。不幸的是,我的书在我的第二门 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();      
   }
}

有人有什么建议吗?

【问题讨论】:

  • 如果您有 工作 代码想要改进,Code Review SE 可能是一个值得关注的地方。
  • 让我直截了当地说...您被要求执行一项已经有精心设计且灵活的 API 的常见任务,但您被禁止使用该 API,因为它还没教?找其他老师。
  • @BrodoFraggins 有时了解 API 背后的内容很有用。您将来可能不需要实现自己的排序算法,但了解它是如何完成的可能是一件好事。有时老师不希望学生走捷径,因为那样他们可能会错过以后可能需要的基础知识。
  • 您可以将所有代码放在 if 中的单独方法中,因为无论如何它都完全相同
  • @user3580294 教初学者如何实现自己的数据结构和排序算法只会让他们产生这样的想法,即他们应该将自己的劣质临时解决方案应用于所有事情。是的,我知道几乎所有 CS 课程都是这样开始的。几乎所有的 CS 课程都是错误的!应该向初学者传授评估现有解决方案并为工作选择正确解决方案的现实技能。作为一名专业程序员,我的大部分工作都是清理那些从未学过这个学位的白痴。

标签: java arrays sorting


【解决方案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);

作为一个函数

如果在排序方面“可能更有效”意味着复杂性,请使用不同的排序算法

【讨论】:

  • 这不会让他的代码更有效率。如果有的话,函数的堆栈操作会(请注意一点)效率较低。
  • 已编辑以阐明“更高效”的潜在不同含义
【解决方案2】:

看起来您正在使用冒泡排序算法,该算法的平均案例复杂度为 O(n^2)。我建议用具有 O(nlogn) 平均案例复杂度的 Quicksort 替换它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-28
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 1970-01-01
    • 2011-10-18
    相关资源
    最近更新 更多