2016-02-03 4 views
1

Я пытаюсь переместить заглавные слова перед началом предложения. Я ожидаю, что получится:Метод для заглавных букв

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."] 

Ключом является поддержание порядка слов.

Я чувствую, что я очень близко.

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 

Любопытно узнать, какие еще могут быть другие элегантные решения.

+5

Что делать, если вы используете простой вид? '[" a "," This "," test. "," Is "]. sort' returns' => ["Is", "This", "a", "test."] ' – Aguardientico

+2

Что вы хотите 'caport' вернуться для вашего примера? Пожалуйста, отредактируйте, чтобы добавить это. '' string "' не лучшее имя для массива. –

+0

Ваш метод просто делает ['Enumerable # partition'] (http://ruby-doc.org/core-2.3.0/Enumerable.html#method-i-partition) трудным путем. Бросьте в 'Array # flatten', и все готово. –

ответ

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."] 
+1

Красиво поставил сэр (или мадам)! – cDitch

+0

Я не уверен, что «Это» до «Является» ... Я почти уверен, что «i» до «t» в алфавите. –

+1

@Anlek, OP хочет сохранить порядок заглавных букв и некапитализированных слов, а также поставить прежний первый в возвращаемом массиве. –

7

Вопрос был изменен радикально, что делает мой более ранний ответ совершенно неправильным. Теперь, ответ:

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

capsort(["a", "This", "test.", "Is"]) 
# => ["This", "Is", "a", "test."] 

Мой предыдущий ответ был:

def capsort(strings) 
    strings.sort 
end 

capsort(["a", "This", "test.", "Is"]) 
# => ["Is", "This", "a", "test."] 

'Z' < 'a' # => true, нет ничего сделать.

+0

Не совсем. Отредактировал свой основной пост, чтобы уточнить. Спасибо – cDitch

2
def capsort(words) 
    caps = words.select{ |x| x =~ /^[A-Z]/ } 
    lows = words.select{ |x| x !~ /^[A-Z]/ } 
    caps.concat(lows) 
end 
+1

Я не вижу ничего, что заслуживает нисходящего. Я что-то упускаю? Обратите внимание, что вы можете заменить тело метода на '[* words.select {| x | x = ~/^ [A-Z] /}, * words.reject {| x | x = ~/^ [AZ] /}] ', хотя [Enumerable # partition] (http://ruby-doc.org/core-2.2.0/Enumerable.html#method--partition), как используется @sawa, более эффективен. –

+0

Использование '^' дает плохое впечатление. – sawa

+0

Ruby также имеет оператор '' '' '(http://ruby-doc.org/core-2.3.0/Object.html#method-i-21-7E):' x! ~/^ [AZ ]/' – Stefan