数组的条件排序(Ruby)

时间:2018-08-15 19:00:31

标签: arrays ruby sorting

我想按字母顺序对数组进行排序,除非两个单词的首字母相同,在这种情况下,返回的数组应按照它们在给定字符串中出现的顺序显示它们。

例如“我真的爱喇嘛” => [“我”,“爱”,“喇嘛”,“真的”]

我写了以下内容,但只收到错误消息。我可以对其进行调整以使其起作用,还是我完全走错了路?

"I really love lamas".split.sort.collect do |a, z|
  if a[0] == z[0]
  puts a z
  else 
  z a
  end

2 个答案:

答案 0 :(得分:3)

<Route>

步骤如下。

str = "I really love llamas"   

str.split.each_with_index.
          sort { |(a,i),(b,j)| a[0]==b[0] ? i<=>j : a<=>b }.
          map(&:first)
  #=> ["I", "love", "llamas", "really"]

我们可以将该枚举器转换为数组,以查看它将生成并传递到块的值,并将其作为值分配给块变量a = str.split #=> ["I", "really", "love", "llamas"] b = a.each_with_index #=> #<Enumerator: ["I", "really", "love", "llamas"]:each_with_index> a

z

继续

b.to_a
  #=> [["I", 0], ["really", 1], ["love", 2], ["llamas", 3]]

答案 1 :(得分:-2)

需要为Array#sort方法指定一个块。

该块必须实现a和b之间的比较,并且当a跟随b时返回-1,如果a和b相等则返回0,或者如果b跟随a则返回+1。

因此逻辑是:如果首字母相同,则返回0;否则,返回0。否则使用<=>比较整个字符串。排序后,将元素连接到单个字符串

"I really love lamas".split.sort do |a, z|
  if a[0] == z[0]
    0
  else
    a <=> z
  end
end.join(" ")