2016-10-21 3 views
0

私はCSクラスのコードを書いているので、バイナリ検索を使用する必要があります。私は、コードを実行するたびにバイナリ検索の問題?

はしかし、私は私のバイナリ検索で問題がありますと言っていますが、私は理由を把握することはできませんthis

を示すエラーを取得します。

私は他の2つのクラスを投稿することができますが、私は本当にそれが通過していない理由について本当に固執しています。

私は、私の演技や検索の呼び出しで愚かな間違いのように感じる。 先生に感謝します。

編集: ここでは、コードがより良くなるようにするための要件が​​あります。

DirectorがDVDをソートするようにMoviesプログラムを変更します。効率的なコードを生成するために、ソートしてDVDをソートしないようにしてください。 代わりにredesignメソッドを追加します。これにより、ソートされたコレクションにDVDが挿入され、ソートされたコレクションが生成されます。 さらに、ディレクターが特定のDVDを検索する効率的な方法を実装します。メソッドはsearchForDVDと呼ばれるべきです。それは私たちが探しているディレクターを提供する文字列型仮パラメータだけを持つ必要があります。戻り値の型は、DVDが配置されている配列内のインデックスを指定する整数でなければなりません。検索が成功しなかった場合、メソッドは-1を返します。メソッドsearchForDVDは、DVDコレクションクラスにある必要があります。 メインメソッドを変更し、最後に成功した検索と失敗した検索を1回実行して、searchForDVDメソッドもテストするようにします。 成功した検索で見つかったDVDを表示し、そうでない場合は適切なコメントを書き込みます。

プログラムRUN概要:すべてのDVD

が収集して表示している特定のDVD用のもの2枚のDVD

検索を追加した後、さらに2つのDVDを

表示すべてのDVDを追加

表示それは

コレクションに含まれていない特定のDVDを検索

ここには、この1つのクラス全体のコードがあります。


import java.util.*; 

public class DVDCollection 

{ 
    private DVD[] collection; 
    private double totalCost; 

    public DVDCollection() 
    { 
     collection = new DVD[100]; 
     totalCost = 0.0; 
    } 

    public void addDVD(String title, String director, int year, double cost, boolean bluray) 
    { 
     DVD newDvd = new DVD(title, director, year, cost, bluray); 
     int index = Collections.binarySearch(collection, newDvd); 
     if(index >= 0) { 
      System.out.println("DVD with title " + newDvd.getTitle() + " already exists."); 
     } 
     else { 
      int index1 = -index - 1; 
      collection = insertDVD(collection, newDVD, index1); 
      System.out.println("DVD with title " + newDvd.getTitle() + " added."); 
     } 
     totalCost += cost; 
    } 

    private DVD[] insertDVD(DVD[] original, DVD newDVD, int in) 
    { 
     int length = original.length; 
     DVD[] destination = new DVD[length+1]; 
     System.arraycopy(original, 0, destination, 0, in); 
     destination[in] = newDVD; 
     System.arraycopy(original, in, destination, in+1, length-in); 
     return destination; 
    } 

    public String toString() 
    { 
     NumberFormat fmt = NumberFormat.getCurrencyInstance(); 

     String report = "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"; 
     report += "My DVD Collection\n\n"; 

     report += "Number of DVDs: " + count + "\n"; 
     report +="Total cost: " + fmt.format(totalCost) + "\n"; 
     report += "Average cost: " + fmt.format(totalCost/count); 

     report += "\n\nDVD List: \n\n"; 

     for (int dvd = 0; dvd < count; dvd++) 
      report += collection[dvd].toString() + "\n"; 

     return report; 
    } 

} 
+2

ご質問に*を含めてください。 – chrylis

+0

静的メソッド 'binarySearch'で' Collections'クラスを作成しましたか? –

答えて

0

問題が何であるかを語っている。これら2つのパラメータを取りコレクションに方法がありません。

最初のものは、いくつかのクラスまたはインタフェースのリストでなければならず、2番目のものはComparableを実装する必要があります。あなたのクラスDVDはComparableを実装していないようですが、それは推測です。それが何であるかわからない場合は、Comparableを参照する必要があります。

0

二分探索法はjava.util.Listない配列を必要とし、あなたはjava.util.Arrays#asList()を使用して、リストに配列を変換することができますが、DVDはまた、あなたがこのhereための基本を見つけることができ、java.util.Comparatorを実装する必要があります。

0

あなたの質問に直接関係はありませんが、コードは追加されたDVDごとに新しい大きな配列を作成しますが、元の配列は0ではなく100個の要素から始まります。アレイ内には常に100個のヌル要素が存在します。あなたは実際に配列の代わりにArrayListのようなものを実際に使用するべきです。サイズ変更について心配する必要はなく、絶対に必要な場合はいつでもArrayListから配列を取得できます。

Collections.binarySearch()の2つの引数の形式を使用しようとしています。最初の引数はDVDのListである必要があります。 ArrayListListです(技術的には、Listインターフェイスを実装しています)。これは、ArrayListを使用してDVDを保存するもう1つの理由です。 2番目の引数は、検索する項目です。配列がListインターフェイスを実装しているクラスのオブジェクトではないため、コードはコンパイルされません。さらに、このメソッドの2つの引数の形式では、リスト(DVD)に保持されているアイテムはjava.util.Comparableを実装する必要があり、そのドキュメントはhereです。

0

Listではなく配列を持っているので、Arrays.binarySearch()ではなくCollections.binarySearch()を使用してください。

+0

あなたは正しいです!これはそれを修正! – Kris

1

バイナリ検索のためのAPIは、リストはComparableインタフェースの要素で構成されている必要があり

public static <T> 
int binarySearch(List<? extends Comparable<? super T>> list, T key) 

です。 DVDオブジェクトは "Comparable"インターフェースを実装していますか?