1

我想在对象的 ArrayList 上实现快速搜索。这些对象由 int oldId、int newId 和 int inList 以及其他内容组成。

现在,我尝试使用列表中的 Collections.binarySearch 实现二进制搜索,但问题是我需要使用 oldId 和 inList 进行搜索,以从相应的对象中获取 newId。示例:我有 oldId = 9 和 inList = 1,并尝试获取已分配到其他地方的 newId。基本上映射了 oldId-newId 并将它们分组。可能有重复的 oldId,但它们必须位于不同的列表中,并且具有唯一的 newId。

您认为对这些地图对象使用哈希图会更好吗?或者,是否有解决方案(可能是对象的比较器)从 oldId 和 inList 信息中获取 newId。我也在寻找一种快速搜索算法。

非常感谢您的帮助,我很感激想法。

这是我为二进制搜索编写的比较器,但是我不知道如何在此处添加 inList 信息。

public class CompareTermId implements Comparator <MObj>{

public CompareTermId(){}

public int compare(MObj a, MObj b){

    if(a.oldTermId < b.oldTermId) return 1;
    else if(a.oldTermId > b.oldTermId) return -1;
    else return 0;
}

}

4

3 回答 3

1

正如你所邀请的,我将推荐 HashMap :)

原因是因为 HashMap 为单个键提供了有效的恒定时间查找。

如果按如下方式构建哈希映射:

Map<Id, Map<InList, Id>> oldIdToNewIdMap = new HashMap<>();

然后填充它:

Map<InList, Id> inListMap = new HashMap<>();
inListMap.put(oldId, newId);
oldIdToNewIdMap.put(inList, inListMap);

然后你可以查找如下:

Id newId = oldIdToNewIdMap.get(inList).get(oldId);
于 2010-07-27T01:13:20.060 回答
0

我认为最好将所有这些封装到一个类中并使用 List 和 Comparator 来查找它们。

于 2010-07-27T01:03:33.227 回答
0

如果你让你的比较器看起来像这样:

public int compare(MObj a, MObj b) {
    if (a.oldTermId < b.oldTermId) return 1;
    else if (a.oldTermId > b.oldTermId) return -1;
    else if (a.inList < b.inList) return 1;
    else if (a.inList > b.inList) return -1;
    else return 0;
}

即使使用 binarySearch 方法,您也应该是金子。这个比较器会先按照oldTermId再按照inList值对item进行排序,这样oldID相同而inList值不同的两个item就被认为是不同的。

于 2010-07-27T01:03:45.133 回答