0

这是一个有两本书的小图书馆,为了这个问题,它允许用户输入一个随机数字,如果该数字与一本书匹配,则输出该书的标题。我创建了一个名为“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

您希望二进制搜索不仅返回真或假。您希望它返回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 回答