2013-07-23 18 views
29

Chris Pine'ın Öğrenmeyi Öğrenmesini kullanıyorum ve kullanıcı girdisini rastgele sözcüklerin bir listesi biçiminde almak ve daha sonra bunları bir dizide alfabetik olarak sıralamak için göreceli olarak basit bir zorlukla karşılaşıyorum. Bu meydan okuma ile ilgili sorular daha önce ortaya çıkmıştı, ancak SO'yla ilgili özel soruyu bulamamıştım, bu yüzden yineleniyorsa özür dilerim. Bu hile yok ikenBir diziyi görmezden gelerek nasıl alfabetik hale getirebilirim?

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 

, ben küçük harf duyarlılığı olmadan dizi alfabetik anlamaya çalışıyorum. Kafamı dolanmak zordur. casecmp hakkında bilgi aldım, ancak bu bir dizi dizgenin aksine belirli bir dizeyi karşılaştırmak için bir yöntem gibi görünüyor.

Şimdiye kadar gibi şeyler çalışıyorum:

wordlist.to_s.downcase.to_a.sort! 
kötü görünümlü ek olarak, Ruby 2.0 dizeleri dönüştürülmesi izin vermez dahil olmak üzere birden nedenlerle çalışmıyor,

diziler.

+0

Oops! Bahsetmeyi unuttum. Tüm Diziyi sadece bir dizgeye dönüştürdüğümü biliyorum, ancak değerlerle ilgili olduğu gibi değerleri geri almak istiyorum. – user2608684

cevap

75

nereden:

wordlist.sort_by { |word| word.downcase } 

Ya da kısa: Genel olarak

wordlist.sort_by(&:downcase) 
+4

İşte bir ipucu: Bir diziye bir şeyler yapmaya çalışıyorsunuz. Yani google "ruby Array". İlk isabet genellikle Sınıf: XXX (Ruby) olacaktır. Bunlar, aradığınız sınıfın ruby ​​doc'ları. Bağlantıya tıklayın ve solda listelenen yöntemleri taramaya başlayın. İstediğiniz şeyi yapacak bir yöntem bulamazsanız, kontrol edilecek bir sonraki yer de soldaki "Dahil Edilen Modüller" bölümünde yer alır. Enumerable'a tıklayın ve oradaki metotlara da bakın. Enumerable içinde sort_by() bulacaksınız. – 7stud

+10

Her öğe üzerinde bir blok çalıştırdığınız 'map',' sort_by', 'select' gibi yöntemler için, bloğunuz her öğede yalnızca bir yöntemi çağırmaktan oluşuyorsa, sözdizimsel bir şeker var demektir. Şöyle görünüyor: 'wordlist.sort_by (&: downcase)' –

2

, sort_by hesaplamak için basit anahtarları için verimli değildir. http://www.ruby-doc.org/core-2.1.2/Enumerable.html#method-i-sort_by

+2

Korkarım ki 'casecmp', yalnızca nesne kendisini döndüren ruby-doc örneğinde olduğu gibi önemsiz bir işlem değildir. Kendiniz deneyin: ruby ​​-rbenchmark -e 'n = 10; shuffled_words = File.readlines ("/ usr/share/dict/words") haritası (&: chomp) .shuffle; "wordcount: # {shuffled_words.size}" koyar; 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)}}}} ''. Bu durumda sort_by% 40 daha hızlıdır. – Kelvin

0
: Daha verimli karşılaştırma sort_by yöntemi için resmi Yakut belgelere bakın, bir blokla sıralama kullanmak ve verimlilik kazanımları hakkında daha fazla bilgi için casecmp

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

varsayılan karşılaştırma operatörü < => değiştirmektir

Aynı soruyu Ruby kodlama bootcamp'ımda da yaptım. İşte benim için çalıştı:

puts "Type in a sentence." 
sentence = gets.chomp.downcase 
puts sentence.split(" ").sort 
İlgili konular