2013-07-23 16 views
29

Sto usando Learns Program di Chris Pine e sono perplesso sulla sua relativamente semplice sfida di prendere input dell'utente sotto forma di un elenco di parole casuali e quindi di alfabetizzarle in un array. Domande su questa sfida sono emerse prima, ma non sono stato in grado di trovare la mia domanda specifica su SO, quindi mi dispiace se è un duplicato.Come si alfabetizza un array ignorando il caso?

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 

Anche se questo fa il trucco, sto cercando di capire come alfabetizzare la matrice senza maiuscole e minuscole. Questo è difficile da comprendere. Ho imparato a conoscere casecmp ma sembra essere un metodo per confrontare una stringa specifica, al contrario di una serie di stringhe.

Finora ho cercato le cose come:

wordlist.to_s.downcase.to_a.sort! 

che, oltre a guardare male, non funziona per diverse ragioni, tra cui quella di Ruby 2.0 non consente le stringhe da convertire in array.

+0

Oops! Ho dimenticato di menzionare. So che posso solo scaricare l'intero array, una volta convertito in una stringa, ma mi piacerebbe restituire i valori così come sono stati immessi, per quanto riguarda il caso. – user2608684

risposta

75

ne dite:

wordlist.sort_by { |word| word.downcase } 

O ancora più breve:

wordlist.sort_by(&:downcase) 
+4

Ecco un suggerimento: stai cercando di fare qualcosa con un array. Quindi google "ruby array". Il primo hit sarà solitamente Class: XXX (Ruby). Questi sono i documenti ruby ​​per la classe che hai cercato. Fare clic sul collegamento e avviare la scansione dei metodi elencati a sinistra. Se non riesci a trovare un metodo che farà ciò che vuoi, il prossimo luogo da verificare è nella sezione "Moduli inclusi" anche a sinistra. Clicca su Enumerable e guarda anche i metodi. In Enumerable, troverai sort_by(). – 7stud

+10

Per metodi come 'map',' sort_by', 'select', dove stai eseguendo un blocco su ciascun elemento, c'è un po 'di zucchero sintattico se il blocco consiste semplicemente nel chiamare un metodo su ciascun elemento. Assomiglia a questo: 'wordlist.sort_by (&: downcase)' –

2

In generale, sort_by non è efficiente per le chiavi che sono semplici da calcolare. Un confronto più efficace è quello di utilizzare specie con un blocco e sostituire l'operatore di confronto di default < => con casecmp

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

Per ulteriori informazioni sui guadagni di efficienza, consultare la documentazione ufficiale di Ruby per il metodo sort_by: http://www.ruby-doc.org/core-2.1.2/Enumerable.html#method-i-sort_by

+2

Ho paura che 'casecmp' non sia un'operazione banale come nell'esempio ruby-doc, che ha semplicemente restituito l'oggetto stesso. Provalo tu stesso: 'ruby -rbenchmark -e 'n = 10; shuffled_words = File.readlines ("/ usr/share/dict/words"). map (&: chomp) .shuffle; inserisce "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 è il 40% più veloce in questo caso. – Kelvin

0

Ho avuto la stessa domanda sul mio bootcamp di codifica Ruby. Ecco cosa ha funzionato per me:

puts "Type in a sentence." 
sentence = gets.chomp.downcase 
puts sentence.split(" ").sort 
Problemi correlati