【问题标题】:Sort an array alphabetically in Ruby but with capitalised words at the end在 Ruby 中按字母顺序对数组进行排序,但最后使用大写的单词
【发布时间】:2015-02-09 15:57:37
【问题描述】:

我正在尝试在 Ruby 中按字母顺序对字符串进行排序。问题是,它将大写的单词放在字符串的开头,但我希望它们在结尾。

我原来的字符串是:["Apple", "banana", "Zebra", "orange"]

我想要的:["banana", "orange", "Apple", "Zebra"]

【问题讨论】:

  • 示例输出的字符串与输入不同。为了完整起见,您能否展示您当前的排序方式以及示例的输出。这是相对微不足道的,但如果我们使用相同的 var 名称等,在讨论答案时应该会有所帮助
  • 这个问题到底有什么不清楚的地方?她希望数组按指定排序,既不能使用.sort(按字母顺序排序,而不是按大小写排序,然后按字母顺序)也不能使用.sort.reverse
  • @awendt:很明显,但是没有代码的“我想要”问题无论如何都会吸引反对票。解决这个问题似乎很简单
  • 有一点值得澄清:“Aardvark”在所需的排序中是在“Zebra”之前还是之后?
  • “我正在尝试”不是问题。这只是一个声明。

标签: ruby arrays sorting


【解决方案1】:

交换箱子进行排序:

["Apple", "banana", "Zebra", "orange"].sort_by(&:swapcase)
#=> ["banana", "orange", "Apple", "Zebra"]

【讨论】:

  • 聪明加 10。
  • 可能不是问题,而是["iPhone", "item"].sort_by(&:swapcase) #=> ["item", "iPhone"]["IRB", "It"].sort_by(&:swapcase) #=> ["It", "IRB"]
  • @CarySwoveland 不确定这是否真的错了……
  • 见第三段here。排序是否正确真的是无关紧要的。我只是想举报它。
【解决方案2】:

我假设您想对字符串进行排序,但将大写的单词移到排序算法的末尾。

如果只有第一个字符大写,则此方法有效:

p ["banana", "Banana","orange", "Apple", ].sort_by{|x| [x[0].upcase==x[0] ? 1:0,x] }   #=> ["banana", "orange", "Apple", "Banana"]
p ["banana", "Banana","orange", "Apple", ].sort                                        #=> ["Apple", "Banana", "banana", "orange"]

【讨论】:

  • 感谢您的回复,这正是我想要的!
【解决方案3】:

编辑:显然根据 Cary Swoveland 的说法,这将比使用 sort_by 更快,我倾向于相信他,因为 sort 已经优化得非常好。

def new_sort(array)
  cap, non = array.partition {|el|el[0] == el[0].upcase}
  non.sort + cap.sort
end

puts new_sort ["Apple", "banana", "Zebra", "orange"]
# banna
# orange
# Apple
# Zebra

puts new_sort ["THREE", "two", "one",]
# one
# two
# THREE

【讨论】:

  • 我的钱是在提供的解决方案中最快的。它允许使用sort,这比sort_by 快​​得多,并且可以对大小为mn 的数组进行分区,然后对数组进行排序应该比对一个m+n 数组进行排序要快。
【解决方案4】:

另一种方式:

arr = %w{ Apple banana Zebra Camel iPhone waffles Pancakes }
  # => ["Apple", "banana", "Zebra", "Camel", "iPhone", "waffles", "Pancakes"] 

arr.sort.rotate(arr.count { |s| s[/^[A-Z]/] }) 
  # => ["banana", "iPhone", "waffles", "Apple", "Camel", "Pancakes", "Zebra"] 

我们有:

a = arr.sort
  # => ["Apple", "Camel", "Pancakes", "Zebra", "banana", "iPhone", "waffles"]

nbr_capitalized_words = arr.count { |s| s[/^[A-Z]/] }
  #=> 4

a.rotate(nbr_capitalized_words)
  #=> ["banana", "iPhone", "waffles", "Apple", "Camel", "Pancakes", "Zebra"] 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    相关资源
    最近更新 更多