4

私は CS-101 の割り当てに取り組んでおり、1 つのアレイしか使用できません。次のような配列があります。

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

背景の階層は次のとおりです(私の割り当てからの要件):

「最上位には Library というクラスがあります。Library には、Music、Book、および Movie の 3 つのサブクラスがあります。Music には、Song と Album の 2 つのサブクラスがあります。Book には、Fiction と Nonfiction の 2 つのサブクラスがあります。Movie、Fiction、ノンフィクション、ソング、アルバムにはサブクラスがありません。」

現在、書籍を ISBN 番号で並べ替えるメソッドを作成しようとしています。したがって、Fiction と Nonfiction は、Library のサブクラスである Book クラスのサブクラスです。

私はすべてを保持しますLibrary myLibrary[] = new Library[100];

1 つの配列しか許可されていないため、ISBN を書籍のみから取得して並べ替える方法がわかりません。それ以外の場合は、本の配列を作成してから、それらを個別に並べ替えたいと思います。

これを達成するために利用できるヒント/アルゴリズムは何ですか?

アップデート

必要に応じて、さらにコードを投稿できます。しかし、この質問は現在、アプローチに重点を置いています。

4

4 に答える 4

3

ここで重要なのは、継承を正しく設定することと、Comparable インターフェイスを実装することです。例については、こちらを参照してください: Java Comaprableおよび親型の配列で .sort を呼び出すよりも (この場合、これは myLibrary.sort();) プリミティブ型での並べ替えの動作の例を次に示します:プリミティブ型配列の並べ替え

そう

  1. サブタイプに Comparable を実装する
  2. 親タイプの配列を作成して入力します
  3. 配列でソートを呼び出します。

幸運を!

于 2012-09-21T01:16:18.297 に答える
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 に答える
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 に答える
0

アルゴリズムの実際の実装を提供しようとせずに、優先順位を次の方法で実行できるインプレース ソートを実行する必要があります。

1.本は音楽や映画よりも優先されます

2. 2 つのオブジェクトが本である場合、優先度は ISBN に基づきます

于 2012-09-21T01:09:25.883 に答える