【问题标题】:Search using two keys in an arrayList使用 arrayList 中的两个键进行搜索
【发布时间】:2010-07-27 00:58:48
【问题描述】:

我想在对象的 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;
}

}

【问题讨论】:

    标签: java search map arraylist comparator


    【解决方案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);
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

        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值排序,这样oldID相同,inList值不同的两个item就被认为是不同的了。

        【讨论】:

          猜你喜欢
          • 2021-10-29
          • 2017-12-16
          • 2023-03-06
          • 1970-01-01
          • 1970-01-01
          • 2019-08-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多