4

我正在处理 CS-101 任务,并且只允许使用单个数组。我有一个如下所示的数组:

[Song, Song, Album, Fiction, Movie, Nonfiction, Song]

这是背景的层次结构(我的作业要求):

“在顶层,您将有一个名为 Library 的类。Library 将有三个子类:Music、Book 和 Movie。Music 将有两个子类:Song 和 Album。Book 将有两个子类:Fiction 和 Nonfiction。Movie、Fiction、 Nonfiction、Song 和 Album 不会有任何子类。”

我目前正在尝试编写一种方法,按图书的 ISBN 号对图书进行排序。所以小说和非小说是我的书类的子类,它是图书馆的子类。

我把一切都藏在里面Library myLibrary[] = new Library[100];

我不确定如何仅从书籍中检索 ISBN 并对它们进行排序,因为我只允许使用一个数组;否则我很想制作一系列书籍,然后分别对它们进行排序。

我可以利用哪些提示/算法来完成此任务?

更新

如果需要,我可以发布更多代码。但是这个问题目前更多地集中在方法上。

4

4 回答 4

3

这里的关键是正确设置继承而不是实现 Comparable 接口。例如,请参见此处:Java Comaprable并在您的父类型数组上调用 .sort(在您的情况下,这将是 myLibrary.sort();) 以下是排序如何对原始类型起作用的示例:原始类型数组排序

所以

  1. 在您的子类型上实现 Comaparable
  2. 创建父类型的数组并填充它
  3. 在你的数组上调用排序。

祝你好运!

于 2012-09-21T01:16:18.297 回答
1

检查这是否有效。(目前在选项卡上,所以无法运行代码)

[我认为排序后你的书会在数组的一侧饱和。请告诉我结果]

/* book sorting is in decreasing order of ISBN, followed by non book items
The books will be at the beginning of array, other items towards the end */
Arrays.sort(myLibrary, new Comparator<Library>()
    {
        int compare(Library l1, Library l2){
            //if both are books then compare ISBN and return appropriate
            if((l1 instanceof Book) && (l2 instanceof Book)){
                Book b1=(Book)l1; Book b2=(Book)l2;
                if(b1.getISBN()<b2.getISBN) {
                    return -1;
                } else if(b1.getISBN()>b2.getISBN()) {
                    return 1;
                } else {
                    return 0;
                }
            }
            else {//if either one, or none are Book

                //if only l1 is Book, l2 is not
                if(l1 instanceof Book){
                    return 1;
                }

                //if only l2 is Book, l1 is not
                if(l2 instanceof Book){
                    return -1;
                }

                //none are Book
                return 0;
            }
        }
    }
);
于 2012-09-21T01:26:29.783 回答
1

干得好...

正如我之前的回答中提到的,写一个新的Comparator并使用它来比较Library对象。

注意:我没有检查 null 但你应该这样做......

class LibraryComparator implements Comparator<Library> {
    public int compare(Library l1, Library l2){
         // If Both are Book instance do the comparison
         if(l1 instanceof Book && l2 instanceof Book){
              // Assuming ISBN is a String or Long field in your class Book
              return ((Book)l1).getISBN().compareTo(((Book)l2).getISBN());
         } else {
         // Otherwise no change in ordering
              return 0;
              // You could specify sorting logic for Movie and Music here as well
         }
    }
}

然后你可以像这样对数组进行排序:

Arrays.sort(myLibrary, new LibraryComparator());
于 2012-09-21T02:02:20.237 回答
0

在不尝试给出算法的实际实现的情况下,您应该进行就地排序,其中优先级可以通过以下方式完成:

1.书籍比音乐和电影更重要

2.如果两个对象是书籍,则优先级基于 ISBN

于 2012-09-21T01:09:25.883 回答