0

これは質問のための 2 冊の本を持つ小さなライブラリです。ユーザーは乱数を入力でき、その数が本と一致する場合、本のタイトルが出力されます。すべてのタイトルを収容する「Book」というクラスを作成しました。

文字列 book1, book2;

    class Book {

        Book (int _input, String book_1, String book_2) {
            book1 = book_1 = "Read This Book";
            book2 = book_2 = "How to Read a Book";

私のコードがすべて意味をなさない大きな混乱である場合は申し訳ありません...

        }
    }

ArrayList <Book> titles = new ArrayList <Book>(50);


public static Boolean binarySearch(String [] A, int left, int right, String V) { //binary search
        int middle;
        Boolean found = false;

        while (found == false && left <= right) {
            //If middle item == 0, returns true
            middle = (left + right)/2;
            int compare = A[middle].compareTo(V);
            if (compare == 0) {
                found = true;
            } else {
                if (compare >0) {
                    right = middle -1;
                } else {
                    left = middle + 1;
                }
            }
        }
        if (left > right) {
            return false;
        } else {
            return true;
        }
    } 

それから問題...「検索」ボタンを押した後にバイナリ検索を使用して実際に情報を出力する方法がわかりません。これを機能させるために以下に何をすべきかについてのアイデアはありますか?

private void findButtonActionPerformed(java.awt.event.ActionEvent evt) {                                           

        //Take inputted values which will match with book title
        int input = Integer.parseInt(enterNumberField.getText());

        //Store values in array
        Book c = new Book (input, book1, book2);
        titles.add(c);

        String temp;

        //calls out information in array
        for (int j=0; j<=input; j++) {
            for (int x=0; x<=input; x++) {
            temp = titles.get(x) + "\n";
            }
            binarySearchField.setText("" + j); //should output book title
        }
4

2 に答える 2

1

二分探索で true または false だけが返されないようにする必要があります。Book、見つかったアイテム、またはnullこのクエリに一致する本が見つからなかった場合に返すようにします。一貫性を保つために、名前を binarySearch から getBook などの適切な名前に変更することをお勧めします。あなたの場合、要素がそこにあるかどうかを知りたくないので、後で使用するために要素を取得したい(印刷)。

これは、クエリを実行したときにコレクションが想定される動作です。いずれかの Java コレクションの get メソッドを調べてみると、それらが同じことを行い、そこにある場合はアイテムを返すか、null を返すことがわかります。

ここにいくつかのコード例があります。これは単なるサンプル コードです。好きなように変更し、バグにも注意してください。最初は正しいと思われる検索を使用しました。また、ここでは使用しない Map など、キーを値に格納するより良い方法がたくさんあることも知っておいてください。

public class Book{
    public String title;
    public int sameTitle(String bookTitle) {
        return this.title.compareTo(bookTitle);
    }
}

public static Book getBook(Book [] A, int left, int right, String bookTitle) { //binary search
    int middle;

    while (left <= right) {
        //If middle item == 0, returns true
        middle = (left + right)/2;
        int compare = A[middle].sameTitle(bookTitle);
        if (compare == 0) {
            return A[middle];
        } else {
            if (compare >0) {
                right = middle -1;
            } else {
                left = middle + 1;
            }
        }
    }
    return null;
}

// example use of getting and using the book
Book b = getBook(...);
if (b != null){
    System.out.println("Success! you found the book " + b);
}
于 2013-05-19T04:16:10.057 に答える
0

この行を変更してみてください:

int compare = A[middle].compareTo(V);
if (compare == 0) {
    found = true;

に:

int compare = A[middle].compareTo(V);
if (compare == 0) {
    return A[middle];

そして、必ずfindButtonActionPerformedメソッドで結果を取得してください。

また、コードの間違いのようです...A文字列配列ではなくブック配列であってはいけませんか?

于 2013-05-19T04:26:24.183 に答える