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

基于java类中的两个字段实现搜索,java,algorithm,search,collections,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 } 现在我需要在这个类的两个列表实例之间进行搜索

为了便于理解,我试图在这里提供我的需求的简化版本

我有这门课

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 }
现在我需要在这个类的两个列表实例之间进行搜索,找出这两个实例之间有多少hash1的匹配项,以及所有匹配项中有多少对应的hash2的匹配项。清单2将包含大约1000万个MyClass对象


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

只对第二个列表进行排序,在第一个列表上进行迭代,然后在第二个列表中进行二进制搜索,对Onlogn进行排序,并对n个Onlogn项进行二进制搜索


或者使用hashset作为second,在second上迭代,在second上搜索,在

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

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

您只需在MyClass中正确重写equals和hashcode。最后,我建议您尽可能多地使用基本类型。例如,对于第一个列表,最好使用简单数组,而不是列表


此外,在开始时,如果大小不同,您可以选择两个列表中较短的一个,然后迭代该列表

我认为您应该为其中一个列表创建一个hashmap,比如list1-

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

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++;
        }
    }
}