2012-10-12 56 views
1

爲了便於理解,我想在此處提供我的要求的簡化版本。在java類中實現基於2個字段的搜索

我有這個類

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個實例之間,爲所有有多少相應的HASH2比賽的比賽有多少HASH1的比賽。這2個列表將包含大約1000萬個MyClass對象。

現在我打算迭代第一個列表並在第二個列表中搜索。有沒有辦法通過排序或以任何特定方式進行排序來優化搜索?我應該排列這兩個列表還是隻有一個?

回答

0

排序僅次於,遍歷第一個和第二個做的二進制搜索,排序O(nlogn)和二進制n個項目Ø搜索(nlogn)

或使用的HashSet的第二,遍歷第一和第二搜索,O(n)

0

最好的解決方案是迭代沒有比這更快的解決方案。你可以創建哈希映射,並利用該映射不添加相同的密鑰,但它有它自己的創建過載

0

如果你必須檢查所有的元素,我認爲你應該迭代第一個列表,並有一個HashMap的第二個爲AmitD。

您只需在MyClass類中正確覆蓋equalshashcode即可。最後,我會推薦你​​儘可能使用基本類型。例如,對於第一個列表,而不是列表將更好地使用簡單的數組。

此外,在開始時,您可以選擇兩個列表中哪一個是較短的列表(如果大小存在差異)並對該列表進行迭代。

0

我想你應該在列表中的一個(比如說list1)創建一個HashMap -

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重複的問題。