当前位置: 首页 > 知识库问答 >
问题:

如何使用`collections.binarysearch()`对对象的ArrayList进行二分搜索?

鲁彬炳
2023-03-14

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

我为此使用以下代码:

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是具有模型的变量,我希望在ArrayListvehicles中搜索该变量。

为此,我得到以下错误:

编辑:

很抱歉之前没有发布这个,排序不是一个问题。我事先已经对数组列表进行了相应的排序。

共有1个答案

高高雅
2023-03-14

Collections#BinarySearch搜索列表中包含的相同类型的值。在这里,您试图用字符串搜索车辆列表,从而得到共享的错误。
一种方法是创建一个假车辆,以便可以搜索其模型:

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();
 类似资料:
  • 对于我当前的项目,我必须搜索ArrayList of ZipCode对象,以便找到距离用户输入的int zip最远的ZipCode。 下面是编写我遇到问题的方法的说明:public ZipCode findfurtwest(int-pZip)-查找距离提供的邮政编码最远的ZipCode。如果未找到邮政编码,则返回null。例如,距离邮政编码75234最远的是ADAK,AK 99546。 在我的代码

  • PS:如果您想知道为什么中的签名看起来像它们的样子,这里有一个解释:集合的这两个通用签名有何不同。BinarySearch? PPS:曾经有一个答案(现在删除了),您不能在需要的地方传递。好吧,我相信您可以,下面是我的QuickSort的工作实现,它可以做到这一点:https://github.com/all3fox/algos-java/blob/481f2c71952bf2c7510cb93c

  • 我需要在数组上使用二进制搜索来找到它们的索引。我能够做到这一点,但是我现在需要使用数组类型为Integer而不是int的对象。 这里有一个问题:“为binarySearch方法提供代码,记住它接收的参数是Object type Object,如果其中任何一个用于调用compareTo方法,则必须首先将其强制转换为可比或原始对象类型。”

  • 问题内容: 使用示例: 假设我有一个课堂电话。我还有另一个上课电话。 类的ArrayList为。 要遍历.. 的Arraylist而不是这样做: 我们可以像这样简单地遍历ArrayList : 现在,我要迭代并打印出所有第3个对象: 现在我的问题是: 与使用常规的for循环不同,我如何使用ArrayList迭代打印出枪支对象列表? 问题答案: 您要遵循与以前相同的模式: 在这种情况下,它将是:

  • 问题内容: 给出: 给出: 是否有准备使用的库/代码来完成它? 问题答案: 您将无法使用JSON.stringify序列化事件对象,因为事件对象包含对DOM节点的引用,并且DOM在各处都有循环引用(例如,子/父关系)。JSON默认情况下无法处理这些,因此您有点不走运。

  • 描述 person.java personrepository.java qualification.java