【问题标题】:Implementing binary search on an array of Strings在字符串数组上实现二进制搜索
【发布时间】:2018-08-29 02:02:28
【问题描述】:

我遇到了一些麻烦。输入数组基于文件输入,数组的大小由文件的第一行指定。 binarySearch 方法看起来不错,但似乎不起作用。有人可以帮忙吗?谢谢。

public static int binarySearch(String[] a, String x) {
    int low = 0;
    int high = a.length - 1;
    int mid;

    while (low <= high) {
        mid = (low + high) / 2;

        if (a[mid].compareTo(x) < 0) {
            low = mid + 1;
        } else if (a[mid].compareTo(x) > 0) {
            high = mid - 1;
        } else {
            return mid;
        }
    }

    return -1;
}

public static void main(String[] args) {

    Scanner input = new Scanner(System.in);

    System.out.println("Enter the name of your file (including file extension): ");
    String filename = input.next();

    String[] numArray;
    try (Scanner in = new Scanner(new File(filename))) {
        int count = in.nextInt();

        numArray = new String[count];

        for (int i = 0; in.hasNextInt() && count != -1 && i < count; i++) {
            numArray[i] = in.nextLine();
        }

        for (int i = 0; i < count; i++) //printing all the elements
        {
            System.out.println(numArray[i]);
        }

        String searchItem = "The";

        System.out.println("The position of the String is:");
        binarySearch(numArray, searchItem);

    } catch (final FileNotFoundException e) {
        System.out.println("That file was not found. Program terminating...");
        e.printStackTrace();

    }

}

【问题讨论】:

  • 调用binarySearch时数组是否排序?
  • 是的,他们的排序。当数组中的元素被打印出来时,由于某种原因,它们都显示为 null。
  • 这在什么方面不起作用?预期行为与实际行为是什么?你试过什么?
  • 只是好奇,这是家庭作业吗? Arrays.sort(numArray); Arrays.binarySearch(numArray, "The"); 可以替换大部分代码。

标签: java binary-search


【解决方案1】:

我添加了以下示例供您进一步参考。

import java.util.Arrays;

public class BinaryStringSearch {

    public static void main(String[] args) {

        String array[] ={"EWRSFSFSFSB","BB","AA","SDFSFJ","WRTG","FF","ERF","FED","TGH"};
        String search = "BB";

        Arrays.sort(array);

        int searchIndex = binarySearch(array,search);

        System.out.println(searchIndex != -1 ? array[searchIndex]+ " - Index is "+searchIndex : "Not found");
    }

    public static int binarySearch(String[] a, String x) {
        int low = 0;
        int high = a.length - 1;
        int mid;

        while (low <= high) {
            mid = (low + high) / 2;

            if (a[mid].compareTo(x) < 0) {
                low = mid + 1;
            } else if (a[mid].compareTo(x) > 0) {
                high = mid - 1;
            } else {
                return mid;
            }
        }

        return -1;
    }

}

【讨论】:

    【解决方案2】:

    希望对你有帮助:

     public static void main(String ar[]){
    
        String str[] = {"account","angel","apple","application","black"};
        String search= "application";
        int length = str.length-1;
        BinarySearchInString findStrin = new BinarySearchInString();
        int i = findStrin.find(str, 0, length, search);
        System.out.println(i);
    }
    
      public int find(String first[], int start, int end, String searchString){
        int mid = start + (end-start)/2;
    
        if(first[mid].compareTo(searchString)==0){
            return mid;
        }
        if(first[mid].compareTo(searchString)> 0){
            return find(first, start, mid-1, searchString);
        }else if(first[mid].compareTo(searchString)< 0){
            return find(first, mid+1, end, searchString);
        }
        return -1;
      }
    
    【解决方案3】:

    @Mike Rylander 发现你忘记输出结果了。

    您应该使用Arrays.binarySearch 而不是您自己的实现。

    (作为一般规则,JRE 库经过充分测试,有据可查且速度很快。我在 Google 上搜索了“java 二进制搜索”,这个问题排名很高。我尝试了 @Thusitha Indunil 的代码,但没有t 似乎工作。我更加努力地搜索并找到Arrays.binarySearch,它工作。)

    【讨论】:

      【解决方案4】:

      我相信你的问题是你忘了输出结果。尝试将binarySearch(numArray, searchItem); 替换为System.out.println(binarySearch(numArray, searchItem));

      【讨论】:

        【解决方案5】:

        除了已经提到的缺少打印结果之外,我还可以发现四个问题。

        1:您有一个名为numArrayString[],而您正在搜索String"The" 名称numArray 可能有点误导。

        2:我假设您有某种指定的输入文件格式,其中文件中String 的数量由integer 指定为文件中的第一个标记。不过这没关系,作为填充numArray 的for 循环中的一个条件,有in.hasNextInt(),并且使用in.nextLine()Scanner 中取出下一个标记。您应该使用补充检查/删除方法,例如 in.hasNext()in.next()。查看ScannerAPI

        3:binarySearch(String[], String) 方法使用String.compareTo(String)。这是确定此String 到参数String 的字典顺序。尝试比较大写和小写可能不会产生您期望的结果,因为"the".compareTo("The") 不会导致0。您应该查看 String API 的选项来强制所有输入到一个案例,可能在读取文件时,或者使用不同风格的比较方法。

        4:我看到的最后一件事可能被认为是一个极端情况,但是有一个足够大的String 数组,以及一个可能位于右侧很远的搜索字符串,即。数组的高索引端,您可能会得到一个ArrayIndexOutOfBoundsException。这是因为当结果“应该”大于Integer.MAX_VALUE 时,(low + high) 可能会产生负值。然后将结果除以 2,仍然产生负值。这可以通过位移结果而不是除以 2 (low + high) &gt;&gt;&gt; 1 来解决。约书亚·布洛赫 (Joshua Bloch) 对分治算法中的这个常见缺陷提出了很好的article

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-24
          • 1970-01-01
          • 2017-01-26
          • 2021-11-19
          • 2021-12-17
          • 1970-01-01
          相关资源
          最近更新 更多