2013-07-23 9 views
29

Ich benutze Chris Pine's Lernen zu programmieren und bin auf seiner relativ einfachen Herausforderung ratlos, Benutzereingaben in Form einer Liste von zufälligen Wörtern zu nehmen und sie dann in einem Array zu alphabetisieren. Fragen zu dieser Herausforderung sind schon früher gestellt worden, aber ich konnte meine spezifische Frage zu SO nicht finden, also tut es mir leid, wenn es ein Duplikat ist.Wie alphabetisiere ich ein Array, das den Fall ignoriert?

Während dies den Trick macht, versuche ich herauszufinden, wie man das Array ohne Berücksichtigung der Groß- und Kleinschreibung alphabetisch sortiert. Das ist schwer zu verstehen. Ich habe über casecmp gelernt, aber das scheint eine Methode zum Vergleichen einer bestimmten Zeichenfolge im Gegensatz zu einem Array von Zeichenfolgen zu sein.

Bisher habe ich versucht worden, Dinge wie:

wordlist.to_s.downcase.to_a.sort! 

, die zusätzlich zu der Suche schlecht, nicht aus mehreren Gründen arbeiten, einschließlich, dass Ruby 2.0 nicht Strings konvertiert werden muss, damit Arrays.

+0

Hoppla! Vergaß zu erwähnen. Ich weiß, dass ich das gesamte Array, das einmal zu einer Zeichenkette konvertiert wurde, einfach herunterrechnen kann, aber ich möchte die Werte genau so zurückgeben, wie sie eingegeben wurden, in Bezug auf den Fall. – user2608684

Antwort

75

Wie wäre:

wordlist.sort_by { |word| word.downcase } 

Oder noch kürzer:

wordlist.sort_by(&:downcase) 
+4

Hier ist ein Tipp: Sie versuchen, etwas zu einem Array zu tun. Also google "Ruby Array". Der erste Treffer ist normalerweise Klasse: XXX (Ruby). Dies sind die Ruby-Dokumente für die gesuchte Klasse. Klicken Sie auf den Link und beginnen Sie mit dem Scannen der links aufgeführten Methoden. Wenn Sie keine Methode finden, die das macht, was Sie wollen, finden Sie den nächsten zu überprüfenden Ort im Abschnitt "Enthaltene Module" auf der linken Seite. Klicken Sie auf "Enumerable" und sehen Sie sich auch die Methoden dort an. In Enumerable finden Sie sort_by(). – 7stud

+10

Für Methoden wie 'map',' sort_by', 'select', wo Sie einen Block für jedes Element ausführen, gibt es einige syntaktische Zucker, wenn Ihr Block besteht aus nur eine Methode für jedes Element aufrufen. Es sieht so aus: 'wordlist.sort_by (&: downcase)' –

2

Im Allgemeinen ist sort_by nicht effizient für Schlüssel, die einfach zu berechnen sind. Eine effizientere Vergleich ist eine Art mit einem Block zu verwenden, und die Standard-Vergleichsoperator < => mit casecmp

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

Weitere Informationen über Effizienzsteigerungen, finden Sie in der offiziellen Ruby-Dokumentation für die sort_by Methode ersetzen: http://www.ruby-doc.org/core-2.1.2/Enumerable.html#method-i-sort_by

+2

Ich fürchte, dass 'casecmp' keine triviale Operation ist, wie im Beispiel von ruby-doc, das lediglich das Objekt selbst zurückgegeben hat. Probieren Sie es selbst aus: 'ruby -rbenchmark -e 'n = 10; shuffled_words = File.readlines ("/ usr/share/dict/words"). Karte (&: chomp) .shuffle; puts "wordcount: # {shufflled_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 ist in diesem Fall 40% schneller. – Kelvin

0

Ich hatte die gleiche Frage an meinem Ruby-Coding Bootcamp. Hier ist, was bei mir funktioniert hat:

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