2015-07-11 75 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

相关问题