Zoznamy v Groovy

1. Prehľad

V Groovy môžeme pracovať so zoznamami rovnako ako v Jave. Ale s podporou metód rozšírenia sa dodáva s o dosť viac.

V tomto výučbe sa pozrieme na to, ako Groovy postupuje pri mutovaní, filtrovaní a triedení zoznamov.

2. Vytváranie zoznamov Groovy

Groovy poskytuje pri práci s kolekciami určité zaujímavé skratky, ktoré využívajú jeho podporu pre dynamické písanie a literárnu syntax.

Začnime vytvorením zoznamu s niektorými hodnotami pomocou skratkovej syntaxe:

zoznam def = [1,2,3]

Podobne môžeme vytvoriť prázdny zoznam:

def emptyList = []

Groovy predvolene vytvára inštanciu java.util.ArrayList. Avšak môžeme tiež určiť typ zoznamu, ktorý sa má vytvoriť:

def linkedList = [1,2,3] ako LinkedList ArrayList arrList = [1,2,3]

Ďalej možno zoznamy použiť na vytvorenie ďalších zoznamov pomocou argumentu konštruktora:

def copyList = nový ArrayList (arrList)

alebo klonovaním:

def cloneList = arrList.clone ()

Upozorňujeme, že klonovaním sa vytvorí plytká kópia zoznamu.

Groovy používa operátor „==“ na porovnanie prvkov v dvoch zoznamoch na dosiahnutie rovnosti. Pokračujeme predchádzajúcim príkladom, porovnávaním cloneList s zoznam osôb výsledkom je pravda:

assertTrue (cloneList == arrList)

Teraz sa pozrime na to, ako vykonávať niektoré bežné operácie so zoznamami.

3. Načítanie položiek zo zoznamu

Položku môžeme získať zo zoznamu pomocou doslovnej syntaxe, ako napríklad:

def list = ["Dobrý deň", "svet"] assertTrue (zoznam [1] == "svet")

alebo pomocou dostať () a getAt () metódy:

assertTrue (list.get (1) == "Svet") assertTrue (list.getAt (1) == "Svet")

Položky zo zoznamu môžeme tiež získať pomocou pozitívnych aj negatívnych indexov. Ak sa použije negatívny index, zoznam sa číta sprava doľava:

assertTrue (list [-1] == "svet") assertTrue (list.getAt (-2) == "ahoj")

Všimnite si, že dostať () metóda nepodporuje negatívne indexy.

4. Pridanie položiek do zoznamu

Existuje niekoľko skratkových spôsobov pridávania položiek do zoznamu. Definujme prázdny zoznam a pridajme k nemu niekoľko položiek:

def list = [] zoznam << 1 list.add ("Apple") assertTrue (list == [1, "Apple"])

Ďalej môžeme určiť index, na ktorý sa má položka umiestniť. Tiež ak je dĺžka zoznamu menšia ako zadaný index, potom Groovy pridá toľko nulový hodnoty ako rozdiel:

list [2] = "Box" list [4] = true assertTrue (list == [1, "Apple", "Box", null, true])

Nakoniec môžeme použiť „+=” operátor pridať nové položky do zoznamu. V porovnaní s ostatnými prístupmi tento operátor vytvorí nový objekt zoznamu a priradí ho k premennej zoznam:

def list2 = [1,2] list + = list2 list + = 12 assertTrue (list == [1, 6.0, "Apple", "Box", null, true, 1, 2, 12])

5. Aktualizácia položiek v zozname

Položky v zozname môžeme aktualizovať pomocou doslovnej syntaxe alebo sada () metóda:

def list = [1, "Apple", 80, "App"] list [1] = "Box" list.set (2,90) assertTrue (list == [1, "Box", 90, "App"] )

V tomto príklade sa položky v indexe 1 a 2 aktualizujú o nové hodnoty.

6. Odstránenie položiek zo zoznamu

Položku v konkrétnom indexe môžeme odstrániť pomocou odstrániť () metóda:

def list = [1,2,3,4,5,5,6,6,7] list.remove (3) assertTrue (zoznam == [1,2,3,5,5,6,6,7] )

Alebo môžeme prvok tiež odstrániť pomocou znaku removeElement () metóda. Týmto sa zo zoznamu odstráni prvý výskyt prvku:

list.removeElement (5) assertTrue (list == [1,2,3,5,6,6,7])

Navyše, môžeme použiť mínus operátor na odstránenie všetkých výskytov prvku zo zoznamu. Tento operátor však nemutuje podkladový zoznam - vráti nový zoznam:

assertTrue (zoznam - 6 == [1,2,3,5,7])

7. Iterácia na zozname

Groovy pridal nové metódy do existujúcej Javy Zbierky API. Tieto metódy zjednodušujú operácie, ako je filtrovanie, vyhľadávanie, triedenie, agregácia atď., Zapuzdrením štandardného kódu. Podporujú tiež širokú škálu vstupov vrátane uzáverov a výstupných dátových štruktúr.

Začnime pohľadom na dve metódy iterácie zoznamu.

The každý () metóda akceptuje uzavretie a je veľmi podobná metóde pre každý() metóda v jazyku Java. Groovy odovzdá implicitný parameter to čo zodpovedá aktuálnemu prvku v každej iterácii:

def list = [1, "App", 3,4] list.each {println it * 2}

Druhá metóda, eachWithIndex () poskytuje okrem aktuálneho prvku aj aktuálnu hodnotu indexu:

list.eachWithIndex {it, i -> println "$ i: $ it"}

8. Filtrovanie

Filtrovanie je ďalšia operácia, ktorá sa často vykonáva na zoznamoch, a program Groovy poskytuje mnoho rôznych metód, z ktorých si môžete vybrať.

Definujme zoznam, na ktorom sa bude pracovať:

def filterList = [2,1,3,4,5,6,76]

Na nájdenie prvého objektu, ktorý zodpovedá podmienke, môžeme použiť Nájsť:

assertTrue (filterList.find {it> 3} == 4)

Na nájdenie všetkých objektov, ktoré zodpovedajú podmienkam, môžeme použiť findAll:

assertTrue (filterList.findAll {it> 3} == [4,5,6,76])

Pozrime sa na ďalší príklad. Tu chceme zoznam všetkých prvkov, ktoré sú číslami:

assertTrue (filterList.findAll {it instanceof Number} == [2,1,3,4,5,6,76])

Prípadne môžeme použiť grep spôsob, ako urobiť to isté:

assertTrue (filterList.grep (číslo) == [2,1,3,4,5,6,76])

Rozdiel medzi grep a Nájsť metód je to grep môže prijať Objekt alebo a Uzavretie ako argument. Umožňuje teda ďalšie zníženie príkazu podmienky na úplné minimum:

assertTrue (filterList.grep {it> 6} == [76])

Navyše, grep používa Objekt # isCase (java.lang.Object) vyhodnotiť stav každého prvku zoznamu.

Niekedy môžu nás zaujímať iba jedinečné položky v zozname. Na tento účel môžeme použiť dve preťažené metódy.

The jedinečný () metóda voliteľne prijíma uzávierku a ponecháva v podkladovom zozname iba prvky, ktoré zodpovedajú podmienkam uzávierky, zatiaľ čo ostatné vyraďuje. Na určenie jedinečnosti predvolene používa prirodzené usporiadanie:

def uniqueList = [1,3,3,4] uniqueList.unique () assertTrue (uniqueList == [1,3,4])

Prípadne, ak požiadavkou nie je mutovať podkladový zoznam, môžeme použiť znak toUnique () metóda:

assertTrue (["A", "B", "Ba", "Bat", "Cat"]. toUnique {it.size ()} == ["A", "Ba", "Bat"])

Ak chceme skontrolovať, či niektoré alebo všetky položky v zozname spĺňajú určitú podmienku, môžeme použiť každý () a akýkoľvek() metódy.

The každý () metóda vyhodnotí stav v uzávere proti každému prvku v zozname. Potom sa iba vráti pravda ak všetky prvky v zozname spĺňajú podmienku:

def conditionList = [2,1,3,4,5,6,76] assertFalse (conditionList.every {it <6})

The akýkoľvek() metóda sa naopak vráti pravda ak niektorý prvok v zozname spĺňa podmienku:

assertTrue (conditionList.any {it% 2 == 0})

9. Triedenie

Groovy predvolene triedi položky v zozname na základe ich prirodzeného poradia:

assertTrue ([1,2,1,0] .sort () == [0,1,1,2])

ale môžeme zložiť aj a Komparátor s vlastnou logikou triedenia:

Komparátor mc = {a, b -> a == b? 0: a <b? 1: -1} def list = [1,2,1,0] list.sort (mc) assertTrue (zoznam == [2,1,1,0])

Ďalej môžeme použiť min () alebo max () metódy na vyhľadanie maximálnej alebo minimálnej hodnoty bez výslovného volania sort ():

def strList = ["na", "ppp", "ako"] assertTrue (strList.max () == "ppp")
Komparátor minc = {a, b -> a == b? 0: a <b? -1: 1} def numberList = [3, 2, 0, 7] assertTrue (numberList.min (minc) == 0)

10. Zbieranie

Niekedy môžeme chcieť upraviť položky v zozname a vrátiť iný zoznam s aktualizovanými hodnotami. To je možné vykonať pomocou zbierať () metóda:

def list = ["Kay", "Henry", "Justin", "Tom"] assertTrue (list.collect {"Hi" + it} == ["Hi Kay", "Hi Henry", "Hi Justin", „Ahoj Tom“]))

11. Pripojenie sa

Možno niekedy budeme musieť spojiť položky v zozname. Aby sme to mohli urobiť, môžeme pripojiť sa () metóda:

assertTrue (["Jeden", "Dva", "Tri"]. join (",") == "Jeden, dva, tri")

12. Záver

V tomto článku sme sa venovali niekoľkým rozšíreniam, ktoré Groovy pridáva do Javy Zbierky API.

Najprv sme sa pozreli na doslovnú syntax a potom na jej použitie pri vytváraní, aktualizovaní, odstraňovaní a načítaní položiek v zozname.

Nakoniec sme sa pozreli na podporu Groovy pre iteráciu, filtrovanie, vyhľadávanie, zhromažďovanie, spájanie a triedenie zoznamov.

Ako vždy sú všetky príklady diskutované v článku dostupné na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found