Java,在对象列表中搜索?

2022-09-03 10:09:01

在以最快的速度实现这一目标的路上,我有点迷茫。我有一个具有基本变量属性(带有getters /setters)的大型对象列表,我需要在此列表中进行搜索以查找列表中与给定参数匹配的对象

我已经找到了如何进行常规列表搜索,但我需要,例如,为列表中的每个对象搜索调用getName()的结果的值,并获取具有与我的输入匹配的结果的对象。

如下所示,其中第三个参数是方法调用的结果,第二个参数是我试图找到的。

   int index = Collections.binarySearch(myList, "value", getName());

任何建议是值得赞赏的


答案 1

如果你只是一次性操作需要找到其 getName() 是特定值的对象,那么可能没有太多的魔力:循环列表,在每个对象上调用 getName(),对于匹配的对象,将它们添加到结果列表中。

如果 getName() 是一个昂贵的操作,并且有一些其他方法可以先验地计算出给定对象是否绝对不会返回匹配值,那么显然你可以在循环时构建这个“过滤”。

如果你经常需要为给定的getName()获取对象,那么保留一个索引(例如在HashMap中)[getName()的结果)->对象->匹配列表]。您需要决定如何以及是否需要将此“索引”与实际列表保持同步。

另请参阅另一个命题,即使用 binarySearch() 但要保持列表的维护。这样,插入比使用地图和未排序列表更昂贵,但如果插入与查找相比不频繁,则它具有只需要维护一个结构的优点。


答案 2

看看需要比较器的二进制搜索

公共静态int二进制搜索(列表列表,T键,比较器c)

所以你会做这样的事情:

class FooComparator
    implements Comparator<Foo>
{
    public int compare(T a, T b)
    {
        return (a.getName().compareTo(b.getName());
    }
}

int index = Collections.binarySearch(myList, "value", new FooComparator());

当然,您需要首先对列表进行排序(Collections.sort也需要一个Comaprator...)。