【问题标题】:Implementing search based on 2 fields in a java class基于java类中的2个字段实现搜索
【发布时间】:2012-10-03 14:42:47
【问题描述】:

为了便于理解,我试图在此处展示我的要求的简化版本。

我有这门课

public class MyClass {
   private byte[] data1;
   private byte[] data2;
   private long hash1;  // Hash value for data1
   private long hash2;  // Hash value for data2
   // getter and setters }

现在我需要在这个类的 2 个 List 实例之间进行搜索,找出这 2 个实例之间有多少 hash1 匹配,以及所有匹配有多少对应的 hash2 匹配。 2 列表将有大约 1000 万个 MyClass 对象。

现在我计划遍历第一个列表并在第二个列表中搜索。有没有一种方法可以通过以任何特定方式排序或排序来优化搜索?我应该对两个列表进行排序还是只对 1 个进行排序?

【问题讨论】:

    标签: java algorithm search collections


    【解决方案1】:

    我认为您应该为其中一个列表创建一个哈希图(比如list1)-

    Map<Long, MyClass> map = new HashMap<Long, MyClass>(list1.size());//specify the capacity
    //populate map like - put(myClass.getHash1(), myClass) : for each element in the list
    

    现在只需遍历第二个列表(对两者都进行排序没有意义)-

    int hash1MatchCount = 0;
    int hash2MatchCount = 0;
    for(MyClass myClass : list2) {
        MyClass mc = map.get(myClass.getHash1());
        if(mc != null) {
            hash1MatchCount++;
            if(myClass.getHash2() == mc.getHash2) {
                hash2MatchCount++;
            }
        }
    }
    

    注意:假设hash1 重复没有问题。

    【讨论】:

      【解决方案2】:

      如果您必须检查所有元素,我认为您应该遍历第一个列表并为第二个列表创建一个 Hashmap,如 AmitD 所述。

      您只需在 MyClass 类中正确覆盖 equalshashcode。最后,我会建议你尽可能使用基本类型。例如,对于第一个列表,使用简单数组而不是列表会更好。

      此外,在开始时,您可以选择两个列表中的哪一个是较短的(如果大小不同)并遍历该列表。

      【讨论】:

        【解决方案3】:

        第二次排序,第一次迭代,第二次进行二分查找,排序 O(nlogn),对 n 项进行二分查找 O(nlogn)

        或者第二次使用hashset,先迭代然后再搜索,O(n)

        【讨论】:

          【解决方案4】:

          最好的解决方案是迭代,没有比这更快的解决方案了。您可以创建 Hashmap 并利用 map 不会添加相同的键,但它有自己的创建重载

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2010-12-19
            • 2022-01-07
            • 2015-12-09
            • 2011-09-06
            • 1970-01-01
            • 2014-11-10
            • 2012-08-30
            • 2018-11-03
            相关资源
            最近更新 更多