Sorteren was al vroeg een bezigheid voor computerwetenschappers. Er waren veel algoritmen die binnenkwamen en buiten gebruik raakten en nog steeds verleggen nieuwe algoritmen de prestatiegrenzen. Omdat het een taal op hoog niveau is, implementeert u geen sorteeralgoritmen in Robijn als je om prestaties geeft, en bovendien om sorteren Arrays en andere collecties zijn nog meer dingen die Ruby voor je doet.
Technisch gezien is sorteren een taak die wordt afgehandeld door de module Enumerable. De Enumerable-module verbindt alle soorten collecties in Ruby met elkaar. Het behandelt iteratie over collecties, sorteren, doorzoeken en vinden van bepaalde elementen, enz. Hoe Enumerable een collectie sorteert, is een beetje een mysterie, of dat zou het tenminste moeten blijven. Het daadwerkelijke sorteeralgoritme is niet relevant, het enige dat u hoeft te weten, is dat objecten in de collectie worden vergeleken met de "ruimteschipoperator".
De "ruimteschipoperator" neemt twee objecten, vergelijkt ze en retourneert vervolgens -1, 0 of 1. Dat is een beetje vaag, maar de telefoniste zelf heeft geen goed gedefinieerd gedrag. Laten we bijvoorbeeld numerieke objecten nemen. Als u twee numerieke objecten heeft
een en b, en evalueren a <=> b, wat zal de uitdrukking evalueren? In het geval van numeriek is het gemakkelijk te zeggen. Als a groter is dan b, is het -1, als ze gelijk zijn, is het 0 en als b groter is dan a, is het 1. Dit wordt gebruikt om het sorteeralgoritme te vertellen welke van de twee objecten het eerst in de matrix. Onthoud dat als de linker operand als eerste in de array moet komen, deze moet worden geëvalueerd tot -1, als de rechterhand de eerste moet zijn, moet deze 1 zijn, en als het niet uitmaakt, moet deze 0 zijn.Het volgt niet altijd zulke nette regels. Wat gebeurt er als u deze operator op twee verschillende soorten objecten gebruikt? Je krijgt waarschijnlijk een uitzondering. Wat gebeurt er als je belt 1 <=> 'aap'? Dit komt overeen met bellen 1. <=> ('aap'), wat betekent dat de daadwerkelijke methode wordt aangeroepen op de links operand en Fixnum # <=> geeft nihil terug als de rechter operand geen numerieke waarde is. Als de operator nul retourneert, zal de sorteermethode een uitzondering opleveren. Controleer dus voordat u arrays sorteert of ze objecten bevatten die kunnen worden gesorteerd.
Ten tweede is het daadwerkelijke gedrag van de ruimteschipoperator niet gedefinieerd. Het is alleen gedefinieerd voor enkele van de basisklassen en voor uw aangepaste klassen is het helemaal aan u wat u wilt dat ze betekenen. Als je een... hebt Leerling klas kunt u de student laten sorteren op achternaam, voornaam, niveau of een combinatie daarvan. Houd er dus altijd rekening mee dat het gedrag van de ruimteschipoperator en het sorteren voor niets anders is gedefinieerd dan voor de basistypen.
U heeft een reeks numerieke objecten en u wilt ze sorteren. U kunt dit op twee manieren doen: soort en soort!. De eerste maakt een kopie van de array, sorteert deze en retourneert deze. De tweede sorteert de array op zijn plaats.
Dat spreekt voor zich. Dus laten we een stapje verder gaan. Wat als je niet wilt vertrouwen op de ruimteschip-operator? Wat als je een heel ander gedrag wilt? Deze twee sorteermethoden hebben een optionele blokparameter. Dat blok heeft twee parameters en moet waarden opleveren, net als de ruimteschipoperator: -1, 0 en 1. Dus, gegeven een array, willen we het sorteren zodat alle waarden die deelbaar zijn door 3 eerst komen, en alle andere daarna. De daadwerkelijke volgorde maakt hier niet uit, alleen dat die deelbaar zijn door 3 eerst komen.
Hoe werkt dit? Let eerst op het blokargument voor de sorteermethode. Ten tweede, let op de modulo-indelingen op de blokparameters en het hergebruik van de ruimteschipoperator. Als één een veelvoud van 3 is, is de modulo 0, anders is het 1 of 2. Aangezien 0 vóór 1 of 2 sorteert, is alleen de modulo hier van belang. Het gebruik van een blokparameter is met name handig in arrays met meer dan één type element, of wanneer u wilt sorteren op aangepaste klassen die geen gedefinieerde ruimteschipoperator hebben.
Er is nog een sorteermethode, genaamd sorteer op. U moet echter eerst begrijpen hoe u arrays en verzamelingen met kaart moet vertalen voordat u sort_by aanpakt.