2016-02-15 53 views
0

我有成千上萬的值存儲在Java數組中。我想比較每個值與數組中的每個其他值。哪種方法比較存儲在數組中的大量值的最有效方法?

目前我正在比較使用兩個嵌套循環。此方法導致堆空間內存錯誤。

下面是我目前使用我的代碼:

for(int i=0; i<arr.size(); i++) 
{ 
    for(int j=i+1; j<arr.size(); j++) 
    { 
     //CODE FOR COMPARING arr[i] and arr[j] 
     //performing some more operations here which contain loops and functions 
    } 
} 

這是比較如此大量數據的最有效的方法是什麼?

編輯: 我正在執行這個使用eclipse。

它是ArrayList的字符串類型。

我使用「.equals」

比較,我也這需要一些更多的內存在循環中執行一些操作。

我甚至試圖在循環內放置一個打印計數來知道循環執行了多少次。它執行了超過32K次。

+1

它取決於你想比較什麼,以及arr的類型是什麼。 – SomeJavaGuy

+2

此外,你想比較平等(==)或比較哪一個更大? –

+3

這是如何使用比原始數組更多的內存? –

回答

2

根據您的類型,你可以

  • 排序的數組,並使用二進制排序O(N log N)
  • 將這些元素添加到HashMap和查找任何配襯O(N)雖然這取決於你有做什麼價值。

Java 8的一個很好的模式是使用groupingBy或reduce。

Map<String, List<MyType>> map = Stream.of(arr) 
           .collect(Collectors.groupingBy(mt -> mt.getKey())); 

這樣做是將所有條目與相同的鍵結合起來。您可以選擇一個密鑰以適合您的比較。這將把具有相同密鑰的所有條目合併到一個集合中,然後你只需要匹配具有相同密鑰的條目。這個分組通過O(n)

0

我想你的內存結束了,因爲你分配了太大的數組。因此,您可以在讀取它們時將您的值插入到HashMap中,從而避免重複輸入,並且可以節省內存。添加到HashMap需要O(1)次,並且當這個元素已經被插入時會給你提供假。希望這可以幫助。

相關問題