前置大写单词的方法

cDi*_*tch 1 ruby

我试图将大写的单词移到句子的前面.我希望得到这个:

capsort(["a", "This", "test.", "Is"])
#=> ["This", "Is", "a", "test."]
capsort(["to", "return", "I" , "something", "Want", "It", "like", "this."])
#=> ["I", "Want", "It", "to", "return", "something", "like", "this."]
Run Code Online (Sandbox Code Playgroud)

关键是维持单词顺序.

我觉得我非常接近.

def capsort(words)
  array_cap = []
  array_lowcase = []
  words.each { |x| x.start_with? ~/[A-Z]/ ? array_cap.push(x) : array_lowcase.push(x) }
  words= array_cap << array_lowcase
end
Run Code Online (Sandbox Code Playgroud)

很想知道其他优雅的解决方案是什么.

Jör*_*tag 7

问题发生了彻底的改变,使我早先的回答完全错误.现在,答案是:

def capsort(strings)
  strings.partition(&/\p{Upper}/.method(:match)).flatten
end

capsort(["a", "This", "test.", "Is"])
# => ["This", "Is", "a", "test."]
Run Code Online (Sandbox Code Playgroud)

我之前的回答是:

def capsort(strings)
  strings.sort
end

capsort(["a", "This", "test.", "Is"])
# => ["Is", "This", "a", "test."]
Run Code Online (Sandbox Code Playgroud)

'Z' < 'a' # => true,没有什么可做的.


saw*_*awa 5

def capsort(words)
  words.partition{|s| s =~ /\A[A-Z]/}.flatten
end

capsort(["a", "This", "test.", "Is"])
# => ["This", "Is", "a", "test."]
capsort(["to", "return", "I" , "something", "Want", "It", "like", "this."])
# => ["I", "Want", "It", "to", "return", "something", "like", "this."]
Run Code Online (Sandbox Code Playgroud)