如何比较多个阵列并确定最接近的匹配?

时间:2015-02-11 13:24:37

标签: ruby-on-rails ruby arrays sorting comparison

我有一个包含主数据的数组,例如:

[1, 3, 7, 11]

和一个包含表格的数据库,该表格包含各种数字的数组,例如:

1) [1, 5, 7, 11]
2) [2, 3, 4, 8, 10]
3) [1, 3, 7, 11, 15]
...

我正在寻找一种简单的方法来计算哪些数组是最接近主数据的数组并相应地对其进行排名。结果就是那个

  1. No 3 - 100%匹配
  2. No 1 - 75%
  3. No 2 - 25%
  4. 这可能不是很困难,但由于某种原因,我无法绕过它。红宝石中的功能还是导轨中的宝石可以帮助解决这个问题吗?

    提前致谢!

3 个答案:

答案 0 :(得分:2)

您可以做的是获取主数组并获取每个数组。在主服务器和每个阵列之间建立交集。获取结果的大小,它将为您提供匹配元素的数量。然后,如果您需要找到百分比,您可以轻松地做到这一点。一个例子:

 master = [1, 3, 7, 11]
 arrays = [[1,2,3,4,5], [1,3,11,0], [1,2,3,7,11]]
 arrays.each{|a| puts ((master & a).size.to_f/master.size.to_f) * 100 }

这将给出匹配的百分比。您需要使用数据库中的数据而不是数组。希望这会有所帮助。

修改

上述仅在数组具有唯一元素时才有效。如果数组具有相同的元素且顺序不重要,则uniq可用于双方。但这可能是部分正确的,因为您可以阅读下面的评论。正如@Cary Swoveland提到的可能是错误的。

答案 1 :(得分:1)

假设订单不重要:

m = [1, 3, 7, 11]
a = [2, 3, 4, 8, 10].dup

m.reduce(0) do |t,i| 
  idx = a.index(i)
  if idx
    a.delete_at(idx)
    t+1
  else
    t
  end
end * 100 / a.size
  #=> 25

答案 2 :(得分:1)

db_arrays成为存储的数组,array是您想要找到最佳匹配的数组。我会做的

ordered = db_arrays.sort_by{|db_array| (db_array & array).size}.reverse

这将根据它们的匹配程度(根据您的标准)给出db_arrays,最好是第一个。

编辑:如果你有大量的db_arrays,那么尝试使用sql查询执行此操作可能会更好,而不是将它们全部加载并使用ruby进行测试。