Java Arrays binarySearch

时间:2012-05-07 20:26:11

标签: java arrays binary-search

好的家伙是我的简单代码,我在其中构建一个String数组并尝试搜索此数组中的字符串:

String[] arr = new String[5];
arr[0] = "ccc";
arr[1] = "aaa";
arr[2] = "bbb";
arr[3] = "eee";
arr[4] = "ddd";

System.out.println(Arrays.binarySearch(arr,"eee"));

直接从Java 6 binarySearch文档中获取:“在进行此调用之前必须对数组进行排序。如果未对其进行排序,则结果未定义”!

实际上我运行我的代码几次得到输出总是3,这是我的NOT SORTED数组中的eee的位置,但结果似乎没有像文档所说的那样“未定义”。

我错过了什么?

由于

6 个答案:

答案 0 :(得分:8)

“未定义”并不意味着“肯定会给你错误的结果”,或“肯定会崩溃”。

答案 1 :(得分:5)

当我们谈论一段代码将如何表现时,术语“未定义”意味着程序执行可以执行以下任何操作:

  • 回答错误答案
  • 永远循环
  • 立即崩溃
  • 损坏一些数据并导致崩溃很久
  • 无意中做其他事情(例如擦除硬盘)
  • 幸运并回答正确的答案

作为程序员的建议,不要调用未定义的行为,因为任何事情都可能发生,无论好坏,现在或以后。

答案 2 :(得分:4)

您错过了“结果未定义”包括“正确”答案的可能性,就像在这种情况下一样。

如果你将arr [1]更改为“eee”,你会看到不同的结果。

答案 3 :(得分:4)

由许多研究所,书籍,教授等定义的二进制搜索。要求按字母或数字方式排序的元素。

import java.util.Arrays;

public class Main {
  public static void main(String[] args) {
    String[] arr = new String[6];
    arr[0] = "ccc";
    arr[1] = "aaa";
    arr[2] = "bbb";
    arr[3] = "eee";
    arr[4] = "ddd";
    arr[5] = "aaa";
    System.out.println(Arrays.toString(arr));
    System.out.println("\"eee\" was found at index: " + Arrays.binarySearch(arr, "eee"));
    Arrays.sort(arr);
    System.out.println(Arrays.toString(arr));
    System.out.println("\"eee\" was found at index: " + Arrays.binarySearch(arr, "eee"));
  }
}

答案 4 :(得分:3)

“未定义”意味着算法将在您的阵列上运行,但结果不能保证正确(二进制搜索强烈需要排序数组才能工作)。您的示例有效,因为这是发生的事情:

  • 使用first = 0,last = 4,middle = 2 compare
  • 输入二进制搜索
  • array [middle] with“eee”(“bbb”<“eee”)=> first = 2 + 1;中= 3;
  • 将array [middle]与“eee”=>进行比较“发现”;返回3;

答案 5 :(得分:1)

添加到esej的答案,这里修改了你的程序,它返回了错误的答案:

public class Main {
    public static void main(String[] args) {
        String[] arr = new String[6];
        arr[0] = "ccc";
        arr[1] = "aaa";
        arr[2] = "bbb";
        arr[3] = "eee";
        arr[4] = "ddd";
        arr[5] = "aaa";

        System.out.println(Arrays.binarySearch(arr, "eee"));
    }
}