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

如何按属性搜索对象数组(Java),java,search,arrays,object,Java,Search,Arrays,Object,是否可以使用array.binarySearch方法通过私有属性在Java中搜索对象数组?我想一定有类似于排序技术的东西,你创建了一个实现Comparator的类,并将其传递给Array.sort,但我似乎找不到任何东西(也许有一些东西,你只返回搜索中使用的属性而不是compareTo方法) 为了清楚起见,我有一个匿名站对象数组,它被传递给另一个类,我想在数组中搜索站的名称,该名称可以通过getName()返回 任何帮助都将不胜感激 是的,有一个需要比较器的。请记住,如果数组已排序,则只能使用b

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

为了清楚起见,我有一个匿名站对象数组,它被传递给另一个类,我想在数组中搜索站的名称,该名称可以通过getName()返回


任何帮助都将不胜感激

是的,有一个需要比较器的。请记住,如果数组已排序,则只能使用
binarySearch

是-事实上,它使用的是您在回答中指定的
比较器

如果查看API中的
binarySearch
方法的实现,您会发现:

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

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

编辑对注释的响应:
T
是a,意味着它可以是任何东西,只要它出现在每个位置上都是相同的。在本例中,这意味着第一个参数必须是第二个参数类型的数组。或者换句话说,如果要对
T
s(
Station
s)数组进行排序,则需要传入该类的实例(
Station
此处)作为要比较的对象。此关键参数将始终作为参数之一传递给比较器的compare方法


所以我怀疑在你的例子中,你传递了一个代表电台名称的字符串;相反,您应该传入一个具有适当名称的
站点的实例。

如果站点数组尚未按站点名称排序,则对每个查询进行排序和搜索是没有意义的。在这种情况下,进行线性搜索更快。但是,如果您可以对数组进行排序,然后执行多个二进制搜索,这是值得的。实现一个比较器,如以下所示,并将其用于排序(Arrays.sort(..)和搜索(Arrays.binarySearch(..):

私有类StationNameComparator实现Comparator{
公共整数比较(s1站、s2站){
返回s1.getName().compareTo(s2.getName());
}
}

请注意,我假设名称是非空且唯一的。

谢谢,最终使用

Arrays.binarySearch(allStations,new Station("nameofstationhere"),new StationCompare())

这可能是一种不好的方式,因为我正在创建一个新的Station对象进行比较。。。但是它是有效的,而且不知道如何使用字符串来完成…

嘿,谢谢你的回答,我确实研究了这个问题,但是我很困惑。。。我传入了数组,一个字符串和用于我提到的排序的比较器,但是得到了这个错误:方法binarySearch(T[],T,ComparatorTanks)为您提供帮助并为我澄清这一点,非常感谢!您好,谢谢,请查看我对上面一个答案的评论,是的,它们已经排序(这是另一个目的所必需的)。我确实传递了用于排序的此比较器,但搜索出现错误…可能是一些基本错误…@Pickles:您传递了错误的参数。搜索方法需要数组、项,然后是比较器。项必须是Station类型,因为这是数组项的类型。因此,必须使用dummy station对象,每次搜索时都使用所需的名称。嘿,谢谢你的帮助,这是我最终做的,但我认为这是错误的方法,可能几分钟前就应该刷新此页面!如果创建多个实例让你感到困扰,你可以对所有搜索使用相同的comparator实例(因为它是无状态的)。此外,假设所有搜索都在同一个线程中运行,您可以重用同一个临时站点对象,并在搜索之前更改其名称字段。无论如何,我不会担心对象创建过多,除非它被证明是性能问题的根源。是的,好的一点……我不在乎对象创建,我只是觉得这样创建一个对象有点奇怪(例如,对于一个较大的对象,您可能需要传入一些空参数,如果创建一个对象会导致一些其他不必要的行为,该怎么办)。如果您可以将任何类型的对象传递给搜索方法,并根据需要重载比较器,那就太好了。但是,嘿,这比手动操作要好得多,所以我不抱怨!再次感谢您的评论。
Arrays.binarySearch(allStations,new Station("nameofstationhere"),new StationCompare())