基于java类中的2个字段实现搜索

时间:2012-10-12 18:19:22

标签: java algorithm search collections

我试图在此处提供我的要求的简化版本以便于理解。

我有这个班级

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进行排序?

4 个答案:

答案 0 :(得分:0)

排序第二,迭代第一次,二次搜索,排序O(nlogn)和二次搜索n项O(nlogn)

或者使用hashset作为第二个,首先迭代并在第二个中搜索,O(n)

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果你必须检查所有元素,我认为你应该迭代第一个列表并为第二个列表提供一个Hashmap作为AmitD。

您必须在equals课程中正确覆盖hashcodeMyClass。最后,我建议您尽可能使用基本类型。例如,对于第一个列表,使用简单数组而不是列表将更好。

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

答案 3 :(得分:0)

我认为你应该为其中一个列表创建一个hashmap(比如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是重复的,没有问题。