【问题标题】:Split an array in ruby based on some condition根据某些条件在 ruby​​ 中拆分数组
【发布时间】:2012-10-16 01:31:40
【问题描述】:

我有一个名为 @level1 的数组,其值如下:

[
  [3.1, 4],
  [3.0, 7],
  [2.1, 5],
  [2.0, 6],
  [1.9, 3]
]

我想将其拆分为两个数组,以便第一个数组 (@arr1) 包含直到 2.1 的值,第二个数组 (@arr2) 包含它之后的值。

之后,我将通过执行以下操作对我的第二个数组进行反向排序:

@arr2 = @arr2.sort_by { |x, _| x }.reverse

然后我想将此数组合并到@arr1。有人可以帮我如何拆分数组然后将它们合并在一起吗?

【问题讨论】:

  • 你能告诉我们你的预期输出吗?
  • @arr1 = { [3.1, 4], [3.0, 7]} @arr2 = { [2.1, 5], [2.0, 6], [1.9, 3]} 然后我将反向排序@arr2 这将给我以下结果:@arr2 = { [1.9, 3] , [2.0, 6], [2.1, 5]} 然后我将合并这两个数组

标签: ruby arrays multidimensional-array


【解决方案1】:

试试partition 方法

@arr1, @arr2 = @level1.partition { |x| x[0] > 2.1 }

可能需要调整那里的条件,因为问题中没有很好地说明这一点,但这应该提供一个很好的起点。

【讨论】:

  • 你可能想使用x[0] <= 2.1
  • @texasbruce 不,arr1 应该包含较大的值,因此不应颠倒条件。无论如何,由于这个问题没有很好地指定确切的条件,我不太担心在这里得到完全正确的情况。
  • 它说:未定义的方法`>' for ["3.1"]:Array
【解决方案2】:

这样的?

arr = [
  ["3.1", 4],
  ["3.0", 7],
  ["2.1", 5],
  ["2.0", 6],
  ["1.9", 3]
]

arr1, arr2 = arr.inject([[], []]) do |f,a|
  a.first.to_f <= 2.1 ? f.last << a : f.first << a; f
end

arr = arr1 + arr2.reverse
# => [["3.1", 4], ["3.0", 7], ["1.9", 3], ["2.0", 6], ["2.1", 5]]

【讨论】:

  • 它说未定义的方法`
  • 我的答案中的代码在 1.8.7 上运行良好(与所有其他版本一样),这里是 the proof
  • 我认为每行中的第一个元素是 3.1、3.0、2.1 等等,都被认为是一个字符串。如何将其转换为整数。它无法比较,因为它是一个字符串。
  • 好的,我设法将其转换为浮动,现在可以使用。谢谢
猜你喜欢
  • 2015-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-02
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
相关资源
最近更新 更多