Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Arrays.binarySearch(arr,“b”的输出是-1。请澄清 导入java.util.array; 导入java.util.Comparator; 公共类主类{ 公共静态void main(字符串参数[]){ 字符串[]arr={“c”、“d”、“b”、“a”、“e”}; InnerClass in=新的InnerClass(); Arrays.sort(arr,in); 用于(字符串str:arr){ 系统输出打印(str+“”); } System.out.println(Arrays.binarySearch(arr,“b”)); } 静态类InnerClass实现了Comparator{ 公共整数比较(字符串s1、字符串s2){ 返回s2.比较到(s1); } } }_Java_Arrays - Fatal编程技术网

为什么Arrays.binarySearch(arr,“b”的输出是-1。请澄清 导入java.util.array; 导入java.util.Comparator; 公共类主类{ 公共静态void main(字符串参数[]){ 字符串[]arr={“c”、“d”、“b”、“a”、“e”}; InnerClass in=新的InnerClass(); Arrays.sort(arr,in); 用于(字符串str:arr){ 系统输出打印(str+“”); } System.out.println(Arrays.binarySearch(arr,“b”)); } 静态类InnerClass实现了Comparator{ 公共整数比较(字符串s1、字符串s2){ 返回s2.比较到(s1); } } }

为什么Arrays.binarySearch(arr,“b”的输出是-1。请澄清 导入java.util.array; 导入java.util.Comparator; 公共类主类{ 公共静态void main(字符串参数[]){ 字符串[]arr={“c”、“d”、“b”、“a”、“e”}; InnerClass in=新的InnerClass(); Arrays.sort(arr,in); 用于(字符串str:arr){ 系统输出打印(str+“”); } System.out.println(Arrays.binarySearch(arr,“b”)); } 静态类InnerClass实现了Comparator{ 公共整数比较(字符串s1、字符串s2){ 返回s2.比较到(s1); } } },java,arrays,Java,Arrays,输出e d c b a-1 如果我们更换 数组。二进制搜索(arr,“b”)到数组。二进制搜索(arr,“e”)输出为 输出e d c b a-6您的数组未排序 仅适用于排序数组: 在进行此调用之前,必须根据数组元素的自然顺序(如通过sort(Object[])方法)将数组按升序排序。如果未排序,则结果未定义 数组按相反顺序排序(如调试循环所示)。将比较器更改为返回s1.compareTo(s2) 顺便说一句,Java的String类已经具有可比性,所以我认为您不需要提供自定义比较器。默认设置就

输出e d c b a-1

如果我们更换 数组。二进制搜索(arr,“b”)到数组。二进制搜索(arr,“e”)输出为
输出e d c b a-6

您的数组未排序

仅适用于排序数组:

在进行此调用之前,必须根据数组元素的自然顺序(如通过sort(Object[])方法)将数组按升序排序。如果未排序,则结果未定义


数组按相反顺序排序(如调试循环所示)。将比较器更改为
返回s1.compareTo(s2)

顺便说一句,Java的
String
类已经具有可比性,所以我认为您不需要提供自定义比较器。默认设置就可以了


数组。binarySearch
要求输入数组按照其元素的自然顺序(升序)排序。如果找不到元素,则返回一个负数(例如
-1
)作为幻值。只有满足“数组必须排序”的前提条件,才能找到元素。否则,函数的结果要么是无意义的值,要么是负数(负数是幸运的结果,因为否则你不知道结果是否正确)。

@dhS如果没有排序,结果是未定义的。有时(例如,对于某些未排序的数组,包含a
“b”
),它可能是-1,有时它可能恰好找到一个结果。@Paul否,它是未定义的。它表示,如果对插入点进行排序,它将返回插入点。它没有说明如果数组没有排序,它将返回什么。事实上,它的字面意思是“如果没有排序,结果是未定义的”。@dhS我对返回-6的原因有一个猜测,但是知道“为什么”并不能帮助你做任何你想做的事情。按照API的要求,在调用
binarySearch
之前对数组进行排序。@dhS但您知道它为什么未定义吗?@dhS下面是您得到-6的原因。如果你看一下,你会发现搜索开始在数组的中间。由于值
e
大于中点值,搜索将继续到数组的末尾(因此
e
将与
b
a
进行比较)。到达数组的末尾(如Javadoc中所述),返回“-(数组长度)-1,即-5-1,即-6。谢谢你继续问我关于-6的问题,我觉得现在更了解这个方法了。这是一个面试问题。请澄清它是否未排序,以及为什么会给出结果-1我想我解释了a)为什么未排序(或者更确切地说,排序不正确)b)如何修复比较器c)当返回结果
-1
时。大部分都可以在中找到。有什么不清楚的地方不是我的解释或链接的JavaDoc的答案吗?你的答案不正确:-1不是一个神奇的值。正如OP所评论的,也可以返回-6。如果数组已排序但未找到元素,则元素将正确插入
~返回值
(这是按位补码
~
,而不是一元否定)。谢谢,我已将其重新表述为“负数”,它在所有情况下都应为真:)
import java.util.Arrays;
import java.util.Comparator;

public class MainClass {
    public static void main(String args[]) {

        String[] arr = { "c", "d", "b", "a", "e" };

        InnerClass in = new InnerClass();
        Arrays.sort(arr, in);

        for (String str : arr) {
            System.out.print(str + " ");
        }
        System.out.println(Arrays.binarySearch(arr, "b"));
    }

    static class InnerClass implements Comparator<String> {

        public int compare(String s1, String s2) {
            return s2.compareTo(s1);

        }
    }
}