【问题标题】:How to sort array sets in Ruby?如何在 Ruby 中对数组集进行排序?
【发布时间】:2014-08-24 23:01:59
【问题描述】:

我需要以下帮助:

我有 1 个数组集和另一个数组列表:a = [132,175] 和 b = [132,132,132,175,175]。

我想对这两组进行排序,以便最终结果如下所示:

132 =>[132,132,132]

175 =>[175,175]

for i in a
  for c in b
    if i == c
      puts c.inspect
    end
  end
  puts 'Break'
end

我得到的输出:

132
132
132
Break
175
175
Break

我尝试了许多不同的方法,但我无法得到我想要的结果。 谢谢。

【问题讨论】:

  • 数组集是什么意思?这些只是数组。 132 --->[132,132,132] 是什么?
  • 什么是e? ......
  • 我建议您编辑以将ab 仅称为“数组”,如果它是您想要生成的哈希,请说出来并显示它:{132=>[132, 132, 132], 175=>[175, 175]}。不要说您将对两个数组进行排序,因为这可能没有必要。在提出问题时,给出一个简短的、精心构建的示例总是有帮助的(假设问题本身就是如此),并且当您这样做时,始终将所需的结果显示为有效的 Ruby 表达式。首先用 IRB 测试它们,然后复制和粘贴。 IRB 不会接受132 --->[132,132,132],所以不要这么说。
  • @sawa, e 是自然对数的底。它是一个无理超越常数,大约等于 2.718281828。 (我从字面上理解你的问题,正如你对其他人所做的那样。:-)。)
  • @CarySwoveland Ruby 常量必须大写。 RDoc中哪里定义e表示自然对数的底?我只能找到Math::E

标签: ruby arrays sorting


【解决方案1】:

这是众多方法中的一种:

a = [132,175] 
b = [132,132,132,175,175]

a.each_with_object({}) { |e,h| h[e] = [e]*b.count(e) }
  #=> {132=>[132, 132, 132], 175=>[175, 175]}

【讨论】:

  • 对不起 Gary,我的意思是 'a' 是一个数组集,而 'b' 是一个数组。我写这个问题太累了,我以为我的程序员同事会理解我的问题,即使如此糟糕。
【解决方案2】:

一般来说,Ruby 不会使用“for...in”语句来制作它,它不是“Ruby 方式”。 “each”、“map”或“inject”方法是更好的选择。

2.1.2 :046 > a = [132,175]
=> [132, 175]
2.1.2 :047 > b = [132,132,132,175,175]
=> [132, 132, 132, 175, 175]
2.1.2 :048 > a.inject({}) {|r,e| r.merge({e => b.select{ |v| v == e}})}
=> {132=>[132, 132, 132], 175=>[175, 175]}

短一点

2.1.2 :050 > a.inject({}) {|r,e| r.merge({e => [e] * b.count(e)})}
=> {132=>[132, 132, 132], 175=>[175, 175]}

【讨论】:

  • 谢谢。是的,我正在开发 Ruby on Rails 项目。我需要遍历记录。设置“a”代表成员 ID,设置“b”代表属于成员的项目。我需要按照我在原始问题中描述的方式使用它。非常感谢您告诉我如何重新调整我的编码。
【解决方案3】:

你的问题不清楚。

首先,选择哪些项目最终出现在结果中的逻辑不清楚。因此,我假设您希望从 b 数组中选择的项目与 a 数组的项目相对应。

其次,不清楚“结果”是指输出还是对象(如哈希)。所以,我假设你想要一个对象结果。

def select_keys keys, array
  res = {}
  keys.each {|key| res[key] = array.select {|v| v == key}}
  res
end

a
=> [132, 175]
b
=> [132, 132, 132, 175, 175]
select_keys a, b
=> {132=>[132, 132, 132], 175=>[175, 175]}

如果你想让select_keys 作为一个数组方法运行,试试这个:

class Array
  def select_keys array
    res = {}
    self.each {|key| res[key] = array.select {|v| v == key}}
    res
  end
end

a.select_keys b
=> {132=>[132, 132, 132], 175=>[175, 175]}

【讨论】:

  • 非常感谢。我会考虑的。
【解决方案4】:
b = [132,132,132,175,175]
p b.group_by{|el| el} # => {132=>[132, 132, 132], 175=>[175, 175]}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 2011-07-25
    • 2015-04-29
    • 1970-01-01
    • 2011-07-25
    • 2012-11-18
    相关资源
    最近更新 更多