如何比较3个以上的数组以找到具有最高优先级的数组

时间:2014-12-10 12:42:48

标签: ruby-on-rails ruby ruby-on-rails-3 sorting bubble-sort

我有以下数组设置保持优先级,

array1 = [1, 2, 1, 2, 3]
array2 = [1, 1, 1, 2, 3]
      |
      |
      |
arrayn = [1, 3, 1, 2, 3]

我想找出最简单的方法来找出具有最高优先级的数组变量,即1

应该以下列方式检查,

如果任何数组的最后一个元素应该返回最低。 如果多个数组的最后一个元素相同,则应匹配该数组的前一个元素 在上面给出的例子中,所有3个数组的最后3个值是相同的,因此它将检查第二个最后一个元素

array1 = 2
array2 = 1
array3 = 3

所以它应该返回array2。

如果有人不理解这个问题,请告诉我

更多例子

示例1

arr1 = [1,1,1,1,3]
arr2 = [3,3,3,3,2]
should return arr2

示例2

arr1 = [2,2,2,1,3]
arr2 = [1,2,1,3,3]
should return arr1, as arr1.last == arr2.last (i.e. 3) 
but arr1[3] < arr2[3] i.e. (1 < 3)

2 个答案:

答案 0 :(得分:3)

对于大小相等的数组(如果我理解正确的问题),这应该有效:

arrays = [
  [1, 2, 1, 1, 3],
  [1, 3, 1, 2, 3],
  [1, 1, 1, 2, 3],
  [1, 3, 1, 1, 3]
]

p arrays[arrays.transpose.reverse.map{|el|
  next if el.count(el.min) != 1
  el.rindex(el.min)
}.compact[0]]

结果:

#=> [1, 1, 1, 2, 3]

一步一步:转置数组并开始检查上一个块。如果没有一个最小优先级跳过这个块(在输出中输入nil),如果只有一个 - 得到它的索引。删除所有nil元素并使用第一个找到的索引来打印所需的数组。

已更新

如果您希望在初始数组数组没有答案时处理这种情况,您可以用这种方式更改代码:

idx = arrays.transpose.reverse.map{|el|
  next if el.count(el.min) != 1
  el.rindex(el.min)
}.compact[0]

p idx ? arrays[idx] : "no answer"

[[1,1,1,1,1], [1,1,1,1,2], [2,1,1,1,1], [2,1,1,1,2]]的结果将是:

#=> "no answer"

答案 1 :(得分:0)

tab = [array1, array2, array3, arrayn]
i   = -1
while tab.count != 1 && tab.count + i >= 0
    tab = tab.select { |t| t[i] == tab.map { |j| j[i] }.min }
    i   = i - 1
end
result = tab[0]