如何按属性(Java)搜索对象数组

时间:2010-07-19 14:38:55

标签: java search arrays object

是否可以使用Array.binarySearch方法通过私有属性搜索Java中的对象数组?我认为必须有类似于排序技术的东西,你创建一个实现Comparator的类并将其传递给Array.sort,但我似乎找不到任何东西(也许有些东西代替compareTo方法)你只需返回搜索中使用的属性)??

要清楚我有一个匿名的Station对象数组,并将其传递给另一个我想在数组中搜索工作站名称的类,可以通过getName()返回。

非常感谢任何帮助!

4 个答案:

答案 0 :(得分:5)

是 - 实际上它使用了您在答案中指定的Comparator

如果你查看API中binarySearch方法的实现,你会遇到binarySearch(T[] a, T key, Comparator c)

  

使用二进制搜索算法在指定数组中搜索指定对象。

您可以随意使用比较器,因此可以使用它来比较问题中提到的私有属性。

修改对评论的回复:Tgeneric 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对象进行比较......但它有效并且不确定如何仅使用字符串...