繁体   English   中英

Java:为什么这个带有比较器的binarySearch无法正常工作?

[英]java: why this binarySearch with comparator is not working?

更新:我正在尝试使用Collections.sort()对带有比较器参数的arrayList进行排序。 然后进行二进制搜索。

package collection;

import java.util.*;

public class TryBinarySearch {
    public static void main(String[] args){
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < 100; i++)
           list.add(i);
        System.out.println(list);
        int b = Collections.binarySearch(list, 8);
        System.out.println(b); // a is 8 as expected.

        Collections.shuffle(list);
        System.out.println(list);   

        Collections.sort(list, new
                Comparator<Integer>(){
            public int compare(Integer a, Integer b){
                return b.intValue() - a.intValue();
            }
        });
        System.out.println(list);   //list is reversed as expected.
        int a = Collections.binarySearch(list, 8);
        System.out.println(a); // why a is -1?
    }
}

b是预期的8; 我进行了反向排序。 我的问题是为什么a是-1,而不是92?

您对列表进行了混洗,因此未对其进行排序。 您必须具有排序列表才能进行二进制搜索

要执行二进制搜索,必须对列表进行排序。 首先,您需要对列表进行混洗,这会使Collections.binarySearch的先决条件无效。

在进行此调用之前,必须根据指定的比较器(如sort(List,Comparator)方法)将列表按升序排序。 如果未排序,则结果不确定。

该算法依赖于要排序的列表。 因此,当然,当您稍后对其进行排序时, binarySearch起作用。

二进制搜索仅在列表已排序时才有效。 二进制搜索的工作方式是该算法假定,如果其“猜测”索引处的值大于我们所寻找的值,则实际索引必须较低-反之亦然。

如果不对集合进行排序,则该假设将不成立,因此算法将失败。

文档非常清楚地说明了这一点:

在进行此调用之前,必须根据指定的比较器(如sort(List, Comparator)方法)将列表按升序sort(List, Comparator) 如果未排序,则结果不确定。

二进制搜索取决于要搜索的列表的顺序。 您正在明确改组自己的。 您是要通过Comparator对其进行排序吗?

当调用binarySearch(list, key) ,文档说:

该列表必须按照自然顺序升序排列

您的列表是使用自定义Comparator排序的,因此您需要将其传递给调用以指示搜索算法如何比较项目:

    Comparator<Integer> cmp = new Comparator<Integer>(){
        public int compare(Integer a, Integer b){
            return b.intValue() - a.intValue();
        }
    };
    Collections.sort(list, cmp);
    System.out.println(list);   //list is reversed as expected.
    int a = Collections.binarySearch(list, 8, cmp);

对于此调用,文档说:

该列表必须根据指定的比较器以升序排序

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM