是否可以使用Array.binarySearch方法通过私有属性搜索Java中的对象数组?我认为必须有类似于排序技术的东西,你创建一个实现Comparator的类并将其传递给Array.sort,但我似乎找不到任何东西(也许有些东西代替compareTo方法)你只需返回搜索中使用的属性)??
要清楚我有一个匿名的Station对象数组,并将其传递给另一个我想在数组中搜索工作站名称的类,可以通过getName()返回。
非常感谢任何帮助!
答案 0 :(得分:5)
是 - 实际上它使用了您在答案中指定的Comparator
!
如果你查看API中binarySearch
方法的实现,你会遇到binarySearch(T[] a, T key, Comparator c) :
使用二进制搜索算法在指定数组中搜索指定对象。
您可以随意使用比较器,因此可以使用它来比较问题中提到的私有属性。
修改对评论的回复:T
是generic parameter,意味着它可以是任何内容,只要它出现的每个位置都相同。在这种情况下,这意味着第一个参数必须是第二个参数类型的数组。或者换句话说,如果你正在排序T
s(Station
s的数组),那么你需要传入该类的实例(Station
这里)到充当要比较的对象。该关键参数将始终作为比较器比较方法的参数之一传递。
所以我怀疑在你的情况下你传递了一个表示电台名称的字符串;你应该传入一个具有适当名称的Station
实例。
答案 1 :(得分:2)
是的,有一个overload需要一个比较器。请记住,如果数组已经排序,则只能使用binarySearch
。
答案 2 :(得分:0)
如果站点数组尚未按站名排序,则排序和搜索每个查询都没有意义。在这种情况下,进行线性搜索会更快。但是,如果您可以对数组进行排序然后执行多个二进制搜索,那么这是值得的。实现如下的比较器,并将其用于排序(Arrays.sort(..))和搜索(Arrays.binarySearch(..)):
private class StationNameComparator implements Comparator<Station> {
public int compare(Station s1, Station s2) {
return s1.getName().compareTo(s2.getName());
}
}
请注意,我假设名称非空且唯一。
答案 3 :(得分:0)
谢谢,最终使用
开始工作Arrays.binarySearch(allStations,new Station("nameofstationhere"),new StationCompare())
这可能是一个糟糕的方式,因为我正在创建一个新的Station对象进行比较......但它有效并且不确定如何仅使用字符串...