【发布时间】: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 课程都是错误的!应该向初学者传授评估现有解决方案并为工作选择正确解决方案的现实技能。作为一名专业程序员,我的大部分工作都是清理那些从未学过这个学位的白痴。