好的家伙是我的简单代码,我在其中构建一个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的位置,但结果似乎没有像文档所说的那样“未定义”。
我错过了什么?
由于
答案 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)
“未定义”意味着算法将在您的阵列上运行,但结果不能保证正确(二进制搜索强烈需要排序数组才能工作)。您的示例有效,因为这是发生的事情:
答案 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"));
}
}