【问题标题】:BinarySearch unable to find specific elements in String [ ]BinarySearch 无法在字符串 [] 中找到特定元素
【发布时间】:2016-05-23 17:59:28
【问题描述】:

小说的名称及其分配的整数代码存储在排序数组中,因此每个偶数索引(包括 0)包含一个代码,每个奇数索引包含一个标题:

[1、汤姆索亚、2、黑美人、3、金银岛]

目前,我已经实现了一个 BinarySearch 方法,该方法接受用户输入的代码并输出相应的标题(如果存在)。它可以工作,除非用户输入:

  • 100(数组中的最后一个代码)
  • 2、6 或 10;但工作 1

    public static String binarySearch(String [] bookList, int left, int right, String code)
    {
    
    /* bookList - sorted array 
     * left - leftmost index
     * right - rightmost index
     * code - item to look for
     */
    
     int middle;
    
     if (left > right) {
         return "left>right";
     }
    
     middle = (left + right)/2;
     /*set middle to nearest even offset (all # are in  even position)*/
     middle += middle & 1;
    
     if (bookList[middle].equals(code)) {
            return bookList[middle + 1];
     }
    
     if (code.compareTo(bookList[middle]) < 0) {
        return binarySearch(bookList, left, middle - 1, code);
     }
    
     return binarySearch(bookList, middle + 2, right, code);         
    }
    

数组的全部内容可以找到here

【问题讨论】:

  • 您为什么将code(这是一个数字)与String 进行比较?如果比较“2”和“11”会发生什么?将其转换为int,然后进行比较。
  • 数字作为字符串的字典顺序是 - 1,10,11,12, ..., 19, 100, 2, 20, 21... 所以如果您将代码视为字符串,数组未排序。
  • @TDG 我很乐意接受您的评论作为对我不明智问题的回答。
  • 1.在你接受它之前测试它。 2. 这不是不明智的问题。您已经付出了努力,尝试并学到了新事物。

标签: java arrays binary-search


【解决方案1】:

问题在于您的代码是代表数字的字符串。由于您将它们作为字符串进行比较,因此字典顺序为 1、10、11、12、...、19、100、2、20、21...,因此数组未按您想象的那样排序。
你应该做的是将代码解析为int -

int bookCode = Integer.parseInt(code);

然后比较——

if Integer.parseIntbookList[middle] < bookCode
//do something

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-12
    • 1970-01-01
    • 1970-01-01
    • 2020-05-30
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    相关资源
    最近更新 更多