Třídění bylo pro počítačové vědce od samého počátku starostí. Bylo mnoho algoritmy které přišly a vypadly z používání a stále nové algoritmy posouvají hranice výkonu. Jako jazyk vysoké úrovně nebudete implementovat třídicí algoritmy Rubín pokud vám záleží na výkonu a kromě toho na třídění Pole a další sbírky jsou další věci, které pro vás Ruby dělá.
Technicky je třídění úkolem zpracovaným modulem Enumerable. Modul Enumerable je to, co spojuje všechny typy sbírek v Ruby dohromady. Zpracovává iteraci sbírek, třídění, prohledávání a hledání určitých prvků atd. Jak Enumerable třídí kolekci, je trochu záhadou, nebo by alespoň měla zůstat. Skutečný třídicí algoritmus je irelevantní, jediné, co potřebujete vědět, je to, že objekty ve sbírce jsou porovnány pomocí „operátora kosmické lodi“.
„Operátor kosmické lodi“ vezme dva objekty, porovná je a vrátí -1, 0 nebo 1. To je trochu vágní, ale samotný operátor nemá velmi dobře definované chování. Vezměme si například numerické objekty. Pokud máte dva číselné objekty
A a ba vyhodnotit a <=> b, k čemu bude výraz vyhodnocen? V případě Numerics je to snadné říct. Pokud je a větší než b, bude to -1, pokud jsou stejné, bude to 0 a pokud b je větší než a, bude to 1. To se používá k určení algoritmu třídění, který z těchto dvou objektů by měl jít první pole. Nezapomeňte, že pokud má být levý operand na prvním místě v poli, měl by vyhodnotit na -1, pokud by pravá ruka měla být první, měla by být 1, a pokud na tom nezáleží, mělo by to být 0.Ne vždy dodržuje taková uklizená pravidla. Co se stane, pokud použijete tento operátor na dva objekty různých typů? Pravděpodobně dostanete výjimku. Co se stane, když zavoláte 1 <=> 'opice'? To bude ekvivalent volání 1. <=> ('opice'), což znamená, že aktuální metoda je volána na vlevo, odjet operand a Fixnum # <=> vrátí nulu, pokud pravý operand není číselný. Pokud operátor vrátí nulu, způsob řazení zvýší výjimku. Před tříděním polí se proto ujistěte, že obsahují objekty, které lze třídit.
Zadruhé není definováno skutečné chování operátora kosmické lodi. Je definována pouze pro některé základní třídy a pro vaše vlastní třídy je zcela na vás, co chcete, aby znamenaly. Pokud máte Student ve třídě můžete studenta třídit podle příjmení, křestního jména, úrovně stupně nebo jejich kombinace. Vždy mějte na paměti, že chování operátora kosmické lodi a třídění není pro nic jiného než základní typy dobře definováno.
Máte pole numerických objektů a chtěli byste je třídit. Existují dvě primární metody, jak toho dosáhnout: třídit a třídit!. První vytvoří kopii pole, třídí ji a vrátí ji. Druhý třídí pole na místě.
To je docela samozřejmé. Pojďme to vzít do zářezu. Co když se nechcete spolehnout na provozovatele vesmírné lodi? Co když chcete úplně jiné chování? Tyto dvě metody třídění berou volitelný parametr bloku. Tento blok má dva parametry a měl by poskytovat hodnoty stejně jako provozovatel kosmické lodi: -1, 0 a 1. Takže, vzhledem k matici, chceme to třídit tak, aby všechny hodnoty, které jsou dělitelné 3, byly na prvním místě a všechny ostatní následovaly. Skutečný pořádek zde nezáleží, jen to, že ti dělitelní 3 jsou na prvním místě.
Jak to funguje? Nejprve si všimněte argumentu bloku pro metodu řazení. Za druhé si všimněte rozdělení modulů provedeného na parametrech bloku a opětovného použití operátora kosmické lodi. Pokud je jeden násobek 3, bude modulo 0, jinak to bude 1 nebo 2. Protože 0 se bude třídit před 1 nebo 2, záleží pouze na modulo. Použití parametru block je užitečné zejména v polích, které mají více než jeden typ prvku, nebo pokud chcete seřadit podle vlastních tříd, které nemají definovaného operátora kosmické lodi.
Existuje ještě jedna metoda třídění seřazeno podle. Než začnete řešit sort_by, měli byste nejprve pochopit překlad polí a sbírek s mapou.