52

我正在使用 Chris Pine 的 Learn to Program 并且对他相对简单的挑战感到困惑,即以随机单词列表的形式获取用户输入,然后将它们按字母顺序排列在一个数组中。关于这个挑战的问题之前出现过,但我无法找到关于 SO 的具体问题,所以如果它是重复的,我很抱歉。

puts "Here's a fun trick. Type as many words as you want (one per line) and 
I'll sort them in...ALPHABETICAL ORDER! Hold on to your hats!"
wordlist = Array.new
while (userInput = gets.chomp) != ''
   wordlist.push(userInput)
end
puts wordlist.sort

虽然这可以解决问题,但我试图弄清楚如何在不区分大小写的情况下按字母顺序排列数组。这很难缠住我的头。我了解到,casecmp但这似乎是一种比较特定字符串的方法,而不是字符串数组。

到目前为止,我一直在尝试这样的事情:

wordlist.to_s.downcase.to_a.sort!

除了看起来很糟糕之外,它由于多种原因不起作用,包括 Ruby 2.0 不允许将字符串转换为数组。

4

3 回答 3

114

怎么样:

wordlist.sort_by { |word| word.downcase }

甚至更短:

wordlist.sort_by(&:downcase)
于 2013-07-23T01:10:37.153 回答
4

一般来说,sort_by 对于计算简单的键效率不高。更有效的比较是使用带有块的排序并将默认比较运算符 <=> 替换为 casecmp

wordlist.sort { |w1, w2| w1.casecmp(w2) }

有关效率提升的更多信息,请参阅 sort_by 方法的官方 Ruby 文档:http ://www.ruby-doc.org/core-2.1.2/Enumerable.html#method-i-sort_by

于 2014-07-02T12:12:23.320 回答
0

在我的 Ruby 编码训练营中,我也有同样的问题。这对我有用:

puts "Type in a sentence."
sentence = gets.chomp.downcase
puts sentence.split(" ").sort
于 2016-10-11T17:45:35.267 回答