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

标签 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 vehicles 中搜索的具有 model 的变量。

我收到以下错误:

The method binarySearch(List, T, Comparator) in the type Collections is not applicable for the arguments (ArrayList, String, Comparator)

我无法使用它,谁能帮助我了解错误的原因和解决方案。

编辑:

抱歉之前没有发布此内容,排序不是问题。我已经预先对数组列表进行了相应的排序。

最佳答案

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();

关于java - 如何使用 `Collections.binarySearch()` 通过对象的 ArrayList 进行二分搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53238038/

相关文章:

java - 使用比较器进行二分搜索

Java Arrays binarySearch() 插入点

Scala 比较泛型?

java - 如何使用 Grid 并行执行 cucumber 测试用例?

java - 重构 Java EE WebApp 何时有用?

hadoop - 如何在 Hadoop 的 map-reduce 作业中通过自定义比较器对键进行排序?

java - Dijkstra算法中使用的优先级队列的比较器类实现?

c++ - LeetCode TwoSum 解决方案不起作用

java - 如何正确检查输入是否只是二进制数?

java - 必须阅读有关 Java 线程的文章