[英]How to use Collections.binarySearch for ArrayList<List<String>> arr in java
[英]How to use `Collections.binarySearch()` to do a binary search though an ArrayList of objects?
我已经尝试过所有相关问题的答案,例如:
使用`Collections.binarySearch`签名实现二进制搜索
但是他们都没有为我工作。
问题是我想执行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
的变量。
我为此收到以下错误:
类型Collections中的方法binarySearch(List,T,Comparator)不适用于参数(ArrayList,String,Comparator)
我无法使用它,任何人都可以帮助我了解错误的原因和解决方案。
编辑:
抱歉,您之前没有发布过,排序不是问题。 我已经事先对数组列表进行了排序。
Collections#binarySearch
在List
搜索与List
具有相同类型的值。 在这里,您尝试搜索带有字符串的车辆列表,从而得到共享的错误。
一种方法是创建假冒车辆,以便可以搜索其模型:
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();
创建列表视图:
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 AbstractList
并implement RandomAccess
,二进制搜索知道它可以通过索引有效访问。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.