2015-07-11 28 views
-2

我有一個包含約20000行數據的CSV文件。 我需要比較/準確找出eacy陣列重複自我的次數,結果按從高到低排序。如何比較數組並查找以ruby排序的匹配數

a[0000001] = [23.2 ,54 ,87.9 ,34 ,8] 
a[0000002] = [3.2 ,4.9 ,8.7 ,54.3 ,98] 
a[0000003] = [2.32 ,24 ,37.9 ,32 ,8.7] 
a[0000004] = [22.2 ,54 ,72.1 ,3.4 ,8.8] 

等等等等

我試圖找到每個陣列到底有多少次可以說例如[0000001] = [23.2,54,87.9,34, 8]在整個數據中重複了自己。 數組需要按照從高到低的順序進行排序,並且還需要將排序數量從高到低排序。

如果我僞代碼來描述所需要的

a1 = [1,2] 
a2 = [1,4] 
a3 = [1,5] 
a4 = [1,2] 
a5 = [1,4] 
a6 = [1,4] ........... 
a20000[1,8] 
for each a# (a1 for example) 
compare a# with a.all 
a1occuredindata = 2 
go to next a# (a2 for example) 
compare a# with a.all 
a2occuredindata = 3 ..... until a20000 
in the end 
sort 
a2 occured highest number of time = 3 followed by 
a1 = 2 so on so forth 
+0

我不太明白;你能否編輯這個問題來澄清?這個問題提到了CSV,但隨後切換到了數組(或者顯然是一個數組數組)。您顯示的數據與CSV有什麼關係?另外,當你說「從高到低排序」時,你能解釋一下什麼使陣列比另一個更高?同時查看輸入數據和預期輸出會很有幫助。 –

+0

對此感到抱歉。請不要提及CSV。我有示例中給出的數組,其中大約有20,000個。 – user2716736

+0

這樣比較好。這個問題仍然可以用一些改進,但現在我認爲它不需要擱置。感謝您改進您的問題。 –

回答

0

如果您關心的性能取決於。一個簡單的方法是將數組本身用作散列鍵。

results = {} 
arr.each do |row| 
    results[row] ||= 0 
    results[row] += 1 
end 

# Occurrences in reverse order 
p results.values.reverse.sort 

# Unique arrays in desc order 
p results.sort { |(_,v1),(_,v2)| v2 <=> v1 }.map { |elem| elem[0] } 
+0

不關心表現,只是想完成工作。 基本上我只需要每個條目,即 a1 = [23.2,54,87.9,34,8]與數據中的所有其他條目匹配以給出結果自己重複了多少次數 例如a1 = [23.2對照組 a1 = [23.2,54,87.9,34,8] a2 = [2,4,9,28] a3 = [2,5,7.9,8] 4,1] a4 = [23.2,54,87.9,34,8] 將產生如 a1 [23.2,54,87.9,34,8] x 2 ,然後該代碼對a2 = [ 2,4,9,2,8]等等等等。 – user2716736

+0

確定上面的代碼不會超高效,但應該完成這項工作。 我假定ARR數組是所有的數組:) –

+0

的數組如果我僞代碼來描述什麼是需要 A1 = [1,2] A2 = [1,4] A3 = [ 1,5] A4 = [1,2] A5 = [1,4] A6 = [1,4] ........... a20000 [1,8] 每個a#(例如a1) 將#與a進行比較。所有 a1occuredindata = 2 進入下一個#(A2爲例) 到底一個比較有#a.all a2occuredindata = 3 ..... 直到a20000 排序 A2發生的時間爲3號最高 其次是A1 = 2 如此類推 希望澄清 – user2716736

0

您可以使用group_by根據自己的標準(每個數組排序顛倒),然後map每個分區的大小,以獲取計數,最後排序每個分區的大小來劃分的數據。

a.group_by(&:sort).map { |x, xs| [x.reverse, xs.size] }.sort_by(&:last).reverse 

請注意,我將每個陣列從低到高排序並稍後將其反轉。它具有相同的效果。

+0

需要更多的幫助,才能使用上面的代碼 – user2716736

+0

在你的例子中,你有一個名爲'a'的數組,所以你應該能夠複製和粘貼我的代碼以獲得你想要的確切輸出。 – Max

相關問題