我想按字母顺序对数组进行排序,除非两个单词的首字母相同,在这种情况下,返回的数组应按照它们在给定字符串中出现的顺序显示它们。
例如“我真的爱喇嘛” => [“我”,“爱”,“喇嘛”,“真的”]
我写了以下内容,但只收到错误消息。我可以对其进行调整以使其起作用,还是我完全走错了路?
"I really love lamas".split.sort.collect do |a, z|
if a[0] == z[0]
puts a z
else
z a
end
答案 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(" ")