【问题标题】:Finding information stored in array by binary search通过二分查找查找存储在数组中的信息
【发布时间】:2013-05-19 04:12:29
【问题描述】:

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

【问题讨论】:

    标签: java class search binary


    【解决方案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);
    }
    

    【讨论】:

    • 这完全让我头脑清醒,这很有意义,但是我可以只用“Book”替换我的公共静态 binarySearch 中的“false”或“true”吗?因为当我尝试这样做时,它会变成红色下划线,请您再澄清一下吗?
    • 我已经修改了我的答案以澄清一点。您不能仅将 false 替换为 true,而是进行一些小的更改,例如从布尔值更改为 Book。或者你可以按照我在回答中的做法,直接还书
    【解决方案2】:

    尝试改变这一行:

    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 不应该是书籍数组而不是字符串数组吗?

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 2012-11-11
      相关资源
      最近更新 更多