我有以下数组设置保持优先级,
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)
答案 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]