如何使用Ruby比较两个表

时间:2017-01-30 22:21:15

标签: ruby-on-rails ruby

我有两个这样的数组:[[word],[number of occurence] , ... ]

Table 1 : [[["web"], 9], [["paris"], 8], [["html5"], 6], [["css3"], 6] ... ]
Table 2 : [[["web"], 2], [["paris"], 3], [["word"], 5], [["class"], 6] ... ]

我想将表2与表1进行比较,仅显示不在表2上的单词。

通过这个例子,我会得到:

Table 2 doesn't have html5, css3

Ruby有没有可以做到的宝石?

4 个答案:

答案 0 :(得分:4)

这里使用的结构非常不规则,但将其重新映射到更容易使用的东西并不困难:

def hashify(list)
  list.map do |(word), count|
    [ word, count ]
  end.to_h
end

|(word), count|声明从嵌套数组中提取出来,简化了代码。

鉴于样本数据,它的工作原理如下:

table1 = [[["web"], 9], [["paris"], 8], [["html5"], 6], [["css3"], 6] ]
table2 = [[["web"], 2], [["paris"], 3], [["word"], 5], [["class"], 6] ]

hashify(table1)
# => {"web"=>9, "paris"=>8, "html5"=>6, "css3"=>6}

然后你可以用它来计算差异:

hashify(table1).keys - hashify(table2).keys
# => ["html5", "css3"]

答案 1 :(得分:3)

不需要任何宝石。 Array difference工作得很好,但你需要先提取有趣的单词:

var duplduplicateItems cates = results.GroupBy(r => r ).SelectMany(x => x.Skip(1));

使用哈希值会更容易:

table1 = [[["web"], 9], [["paris"], 8], [["html5"], 6], [["css3"], 6]]
table2 = [[["web"], 2], [["paris"], 3], [["word"], 5], [["class"], 6]]

def extract_words(table)
  table.map{|sub_array| sub_array.flatten.first }
end

puts extract_words(table1) - extract_words(table2)
# html5
# css3

答案 2 :(得分:1)

我认为您不需要数字数据,因此我建议您解决问题的单行解决方案:

(table1.flatten - table2.flatten).reject {|elem| elem.is_a?(Integer)}

返回以下数组:

=> ["html5", "css3"]

答案 3 :(得分:1)

return (
    <div style={styles.style.main}>
      <h3 style={styles.style.header}>Vote for your favorite hack day idea</h3>
    </div>
  );