ruby-on-rails - 如何比较 3 个以上的数组以找到优先级最高的数组

标签 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)

最佳答案

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

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]

一步一步:转置数组并从最后一个 block 开始检查。如果没有一个最小优先级,则跳过该 block (在输出中放入 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"

关于ruby-on-rails - 如何比较 3 个以上的数组以找到优先级最高的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27401315/

相关文章:

ruby-on-rails-3 - wicked_pdf 数据流问题

ruby-on-rails - 在环境之前加载初始化程序

ruby-on-rails - Rails中的自定义错误页面?

javascript - Rails 中 AngularJS 的路由和模板。如何路由到模板?

ruby-on-rails - 无法使用过滤器标签运行 rspec

sql - 将 ruby​​ 与数据库一起使用,但没有 rails

ruby-on-rails - 无法使用 Authlogic on Rails 3.0.1 设置 current_user

ruby-on-rails - 如何使用 Redis 跟踪每日和每周的活跃用户?

ruby-on-rails - ActiveRecord 查询比直接 SQL 慢得多?

ruby-on-rails - Rails:如何仅对一个已更改的属性运行before_update?