【问题标题】:Java Arrays binarySearchJava 数组 binarySearch
【发布时间】:2012-05-08 04:32:08
【问题描述】:

好的,伙计们,这是我的一段简单代码,我在其中构建了一个字符串数组并尝试在该数组中搜索一个字符串:

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,这是我未排序数组中 eee 的位置,但结果似乎不是文档所述的“未定义”。

我错过了什么?

谢谢

【问题讨论】:

    标签: java arrays binary-search


    【解决方案1】:

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

    【讨论】:

    • 相反,它的意思是“可以是任何东西,我们没有具体说明它是什么”。周二可能会有所不同,或者如果外面阳光明媚,或者你母亲今天的感受:未指定。
    【解决方案2】:

    当我们谈论一段代码的行为时,术语“未定义”意味着程序执行可以做以下任何事情:

    • 返回错误答案
    • 永远循环
    • 立即崩溃
    • 损坏一些数据并在很久以后导致崩溃
    • 执行其他意外操作(例如擦除硬盘驱动器)
    • 幸运并返回正确答案

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

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

        【讨论】:

          【解决方案5】:

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

          • 进入二分搜索,第一个 = 0,最后一个 = 4,中间 = 2 比较
          • array[middle] with "eee" ("bbb" first = 2 + 1;中间= 3;
          • 比较数组[中间] 与 "eee" => "found" ;返回 3;

          【讨论】:

            【解决方案6】:

            添加到 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"));
                }
            }
            

            【讨论】:

            • 也就是说,数组大小从5变成了6。
            猜你喜欢
            • 2016-12-12
            • 1970-01-01
            • 1970-01-01
            • 2020-05-21
            • 2022-01-23
            • 2015-01-03
            • 2020-07-26
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多