A tömbök rendezési módszerei a Ruby-ban

click fraud protection

A válogatás a számítógépes tudósok számára már a kezdetektől fogva aggodalomra ad okot. Sok volt algoritmusok amelyek bekerültek és kiestek a használatból, és ma is az új algoritmusok tolják a teljesítmény határait. Mivel magas szintű nyelv, nem fog bevezetni a szortírozási algoritmusokat Rubin ha érdekel a teljesítmény, és ezen kívül a válogatás tömbök és más gyűjtemények is olyan dolgok, amelyeket a Ruby az Ön számára csinál.

Technikailag a válogatást az Enumerable modul kezeli. Az Enumerable modul köti össze a Ruby minden típusú gyűjteményét. Kezeli a gyűjtemények iterálását, válogatást, áttekintést és bizonyos elemek megtalálását stb. Az, hogy az Enumerable hogyan rendezi a gyűjteményt, kissé rejtély, vagy legalábbis így kell maradnia. A tényleges rendezési algoritmus nem bír jelentőséggel, csak annyit kell tudnod, hogy a gyűjtemény objektumait összehasonlítják a "űrhajó operátor" segítségével.

A „űrhajó-üzemeltető” két objektumot vesz fel, összehasonlítja őket, majd -1, 0 vagy 1 eredményt ad. Ez egy kicsit homályos, de maga az operátor nem viselkedik nagyon jól. Vegyük például a numerikus objektumokat. Ha két numerikus objektuma van

instagram viewer
egy és b, és értékelje a <=> b, mit fog értékelni a kifejezés? A Numerics esetében könnyű megmondani. Ha a nagyobb, mint b, akkor -1 lesz, ha egyenlők, akkor 0 és ha b nagyobb, mint a, akkor 1 lesz. Ezzel a rendezési algoritmussal meg lehet határozni, hogy a két objektum közül melyiknek kell először mennie a sor. Ne feledje, hogy ha a bal oldali operandus az első a tömbben, akkor -1-re kell értékelnie, ha a jobb kéznek elsőnek kell lennie, akkor 1-nek kell lennie, és ha nem számít, akkor 0-nak kell lennie.

Nem mindig követi az ilyen rendezett szabályokat. Mi történik, ha ezt az operátort különféle típusú objektumokra használja? Valószínűleg kivételt fogsz kapni. Mi történik, ha felhívsz? 1 <=> 'majom'? Ez megegyezik a hívással 1. <=> ( 'Majom), azaz a tényleges módszert hívják a bal operandus és Fixnum # <=> nulla értéket ad vissza, ha a jobb oldali operandus nem numerikus. Ha az operátor nullát ad vissza, a rendezési módszer kivételt vet fel. Tehát a tömbök rendezése előtt ellenőrizze, hogy tartalmaznak-e objektumokat, amelyek rendezhetők.

Másodszor, az űrhajó-üzemeltető tényleges viselkedése nincs meghatározva. Csak néhány alaposztályra van definiálva, és az egyéni osztályokra vonatkozóan teljesen rajtad múlik, mit akar érteni. Ha van Diák osztályban rendezheti a hallgatókat vezetéknév, keresztnév, fokozat szint vagy ezek kombinációja alapján. Tehát mindig tisztában kell lennie azzal, hogy az űrhajó-üzemeltető viselkedése és a válogatás csak az alaptípusoknál van jól meghatározva.

Van egy numerikus objektum tömbje, és rendezni szeretné őket. Két elsődleges módszer van erre: fajta és fajta!. Az első létrehozza a tömb egy példányát, rendezi és visszaküldi. A második a tömböt rendezi a helyén.

Ez elég magától értetődő. Tehát vegyük fel egy bevágással. Mi van, ha nem akar támaszkodni az űrhajó üzemeltetőjére? Mi van, ha egy teljesen más viselkedést akar? Ez a két rendezési módszer választható blokkparamétert vesz igénybe. Ez a blokk két paramétert vesz igénybe, és olyan értékeket kell adnia, mint az űrhajó üzemeltetője: -1, 0 és 1. Tehát, ha tömb van, azt akarjuk rendezni, hogy az összes érték, amely osztható 3-mal, először jusson, és minden más jön utána. A tényleges sorrend itt nem számít, csak az, hogy a 3-mal osztható az első.

Hogy működik ez? Először jegyezze meg a blokk argumentumot a rendezési módszerhez. Másodszor, vegye figyelembe a blokkparamétereken elvégzett modulo osztásokat és az űrhajó-üzemeltető újrafelhasználását. Ha az egyik 3-szoros, akkor a modulo 0, máskülönben 1 vagy 2. Mivel a 0 1 vagy 2 elõtt válogat, itt csak a modulo számít. A blokkparaméter használata különösen akkor hasznos, ha tömbök tartalmaznak egynél több elemet, vagy ha olyan egyedi osztályokban szeretne rendezni, amelyek nem rendelkeznek meghatározott űrhajó-operátorral.

Van még egy fajta módszer, az úgynevezett Sorrend. A sort_by kezelése előtt azonban először meg kell értenie a tömbök és gyűjtemények fordítását a térképpel.

instagram story viewer