如何在Ruby中对数组进行排序?

时间:2014-08-24 23:01:59

标签: ruby arrays sorting

我需要以下方面的帮助:

我有一个数组和另一个数组: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

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

4 个答案:

答案 0 :(得分: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]}

答案 1 :(得分:0)

你的问题不明确。

首先,选择哪些项目最终结果的逻辑不明确。因此,我假设您希望从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作为Array方法运行,请尝试以下方法:

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]}

答案 2 :(得分:0)

一般情况下,Ruby不会使用" for ... in"声明,它不是" Ruby方式"。 "每个","地图"或"注入"方法是更好的选择。

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]}

答案 3 :(得分:0)

b = [132,132,132,175,175]
p b.group_by{|el| el} # => {132=>[132, 132, 132], 175=>[175, 175]}