如何比较数组并查找以ruby排序的匹配数

时间:2015-07-11 12:53:29

标签: arrays ruby sorting csv compare

我有一个包含大约20000行数据的CSV文件。 我需要比较/找出eacy数组重复自我的次数,结果从最高到最低排序。

示例

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]在整个数据中重复了自己。 数组需要从高到低排序,匹配数也需要从高到低排序。

如果我用psuedocode来描述需要什么

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

2 个答案:

答案 0 :(得分:0)

取决于您是否担心表现。一种简单的方法是将数组本身用作Hash键。

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] }

答案 1 :(得分:0)

您可以使用group_by根据您的条件对数据进行分区(每个数组反向排序),然后map将每个分区调整到其大小以获取计数,然后最终按每个分区的大小排序分区。

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

请注意,我将每个数组从低到高排序,然后再将它们反转。它具有相同的效果。