2013-07-23 2 views
29

저는 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! 
나쁜 찾고뿐만 아니라, 루비 2.0 문자열로 변환 할 수 없습니다 것을 포함, 여러 가지 이유로 작동하지 않습니다

배열.

+0

죄송합니다. 언급하는 것을 잊어 버렸습니다. 한 번 문자열로 변환 된 전체 배열을 소멸시킬 수 있지만 대문자와 마찬가지로 값을 반환하고 싶습니다. – user2608684

답변

75

대해 어떻게 :

wordlist.sort_by { |word| word.downcase } 

심지어 짧은 : 일반적으로

wordlist.sort_by(&:downcase) 
+4

다음은 팁입니다. 여러분은 배열에 무언가를하려고합니다. 그래서 구글 "루비 배열". 첫 번째 히트는 보통 Class : XXX (Ruby)입니다. 그것들은 당신이 검색 한 클래스의 루비 문서입니다. 링크를 클릭하고 왼쪽에 나열된 방법을 검색하십시오. 당신이 원하는 것을 할 수있는 방법을 찾을 수 없다면, 다음에 체크 할 곳은 왼쪽의 "Included Modules"섹션입니다. Enumerable을 클릭하고 거기에서 메소드를 살펴보십시오. Enumerable에서 sort_by()를 찾을 수 있습니다. – 7stud

+10

'map','sort_by','select'와 같은 방법으로 각 항목에 블록을 실행하고있는 곳에서 블록이 각 항목에 대한 메소드를 호출하는 것으로 구성되어 있다면 구문 설탕이 있습니다. 'wordlist.sort_by (& : downcase)' –

2

, sort_by은 계산이 간단 키에 대한 효율적이지 않습니다. http://www.ruby-doc.org/core-2.1.2/Enumerable.html#method-i-sort_by

+2

'casecmp '는 단순히 객체 자체를 반환 한 ruby-doc 예제와 같이 사소한 작업이 아닙니다. 직접 해보십시오 :'ruby -rbenchmark -e 'n = 10; shuffled_words = File.readlines ("/ usr/share/dict/words"). map (& : chomp) .shuffle; puts "wordcount : # {shuffled_words.size}"; Benchmark.bmbm {| x | x.report ("sort_by/downcase") {n.times {shuffled_words.sort_by (& : downcase)}}; x.report ("sort/casecmp") {n.times {shuffled_words.sort {| a, b | a.casecmp (b)}}}} ''. sort_by는이 경우 40 % 더 빠릅니다. – Kelvin

0
: 더 효율적인 비교는 sort_by 방법에 대한 공식 루비 설명서를 참조 블록과 종류의 사용 효율성 향상에 대한 자세한 내용은 casecmp

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

와 기본 비교 연산자 < =>를 대체하는 것입니다

루비 코딩 부트 캠프에서 같은 질문을했습니다. 나를 위해 일한 것은 다음과 같습니다.

puts "Type in a sentence." 
sentence = gets.chomp.downcase 
puts sentence.split(" ").sort 
관련 문제