如何使用Collections.binarySearch()通过对象的ArrayList进行二进制搜索?

时间:2018-11-10 10:28:28

标签: java comparator binary-search

我尝试了所有相关问题的答案,如下所示:

Implement binary search using the `Collections.binarySearch` signature

Can't use binary search with Object Arraylist?

但是他们都没有为我工作。

问题是我想做binarySearch()来在ArrayList中查找具有特定属性的对象。

我为此使用了以下代码:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

public class SearchingThread extends Thread {

    private String search;
    private ArrayList<Vehicle> vehicles;

    public SearchingThread(String search, ArrayList<Vehicle> vehicles) {
        this.search = search;
        this.vehicles = vehicles;
    }

    public void run() {

        Comparator<Vehicle> comp = new Comparator<Vehicle>() {

            @Override
            public int compare(Vehicle o1, Vehicle o2) {
                return o1.getModel().compareTo(o2.getModel());
            }

        };

        int index = Collections.binarySearch(vehicles, search, comp);



    }

}

search是我要在ArrayList model中搜索的带有vehicles的变量。

我为此收到以下错误:

  

Collections类型中的binarySearch(List,T,Comparator)方法不适用于参数(ArrayList,String,Comparator)

我无法使用它,任何人都可以帮助我了解错误的原因和解决方法。

编辑:

很抱歉以前没有发布过,排序不是问题。我已经预先对数组列表进行了排序。

2 个答案:

答案 0 :(得分:0)

Collections#binarySearchList中搜索列表所具有的相同类型的值。在这里,您正在尝试使用字符串搜索车辆列表,从而得到共享的错误。
一种方法是创建假冒车辆,以便可以搜索其模型:

Vehicle modelDummy = new Vehicle();
modelDummy.setModel(search);
int index = Collections.binarySearch(vehicles, modelDummy, comp);

请注意,为了像这样使用binarySearch,列表必须根据您提供的Comparator进行排序(即,在这种情况下,根据模型进行排序)。如果此假设不成立,则必须使用O(n)搜索。例如:

Vehicle vehicle = vehicles.stream().filter(v -> v.getModel().eqauls(search)).findFirst();

答案 1 :(得分:0)

创建列表视图:

List<String> view = new AbstractList<String>() {
  @Override public int size() {
    return vehicles.size();
  }

  @Override public String get(int i) {
    return vehicles.get(i).getModel();
  }
};

然后将二进制搜索应用于视图。

int index = Collections.binarySearch(view, search);

请注意,虽然可以使用匿名类来工作,但是最好定义一个命名类(例如,嵌套类,甚至是本地类),以便它们都可以extend AbstractListimplement RandomAccess,以便二进制搜索知道它可以通过索引有效访问。