Popisi u Groovyju

1. Pregled

U Groovyju možemo raditi s popisima baš kao i na Javi. Ali, s podrškom za metode produženja, isporučuje se s prilično malo više.

U ovom uputstvu pogledat ćemo Groovyjev stav o mutiranju, filtriranju i sortiranju popisa.

2. Izrada Groovy popisa

Groovy pruža određene zanimljive prečace pri radu sa zbirkama što koristi njegovu podršku za dinamičko tipkanje i doslovnu sintaksu.

Počnimo s izradom popisa s nekim vrijednostima koristeći skraćenu sintaksu:

def lista = [1,2,3]

Slično tome, možemo stvoriti prazan popis:

def emptyList = []

Prema zadanim postavkama Groovy stvara instancu java.util.ArrayList. Međutim, možemo odrediti i vrstu popisa koji ćemo stvoriti:

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

Dalje, popisi se mogu koristiti za stvaranje drugih popisa pomoću argumenta konstruktora:

def copyList = novi popis nizova (arrList)

ili kloniranjem:

def cloneList = arrList.clone ()

Imajte na umu da kloniranje stvara plitku kopiju popisa.

Groovy koristi operator "==" za usporedbu elemenata na dva popisa radi jednakosti. Nastavljajući s prethodnim primjerom, o usporedbi cloneList s arrlist rezultat je pravi:

assertTrue (cloneList == arrList)

Pogledajmo sada kako izvesti neke uobičajene operacije na popisima.

3. Dohvaćanje predmeta s popisa

Stavku možemo dobiti s popisa koristeći doslovnu sintaksu kao što je:

def list = ["Pozdrav", "Svijet"] assertTrue (popis [1] == "Svijet")

ili pomoću dobiti() i prići() metode:

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

Stavke možemo dobiti i s popisa koristeći i pozitivne i negativne indekse. Kada se koristi negativni indeks, popis se čita zdesna nalijevo:

assertTrue (popis [-1] == "Svijet") assertTrue (list.getAt (-2) == "Pozdrav")

Imajte na umu da dobiti() metoda ne podržava negativne indekse.

4. Dodavanje stavki na popis

Postoji više kratkih načina za dodavanje stavki na popis. Definirajmo prazan popis i dodajte mu nekoliko predmeta:

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

Dalje, možemo odrediti i indeks na koji ćemo smjestiti stavku. Također, ako je duljina popisa manja od navedenog indeksa, tada Groovy dodaje toliko null vrijednosti kao razlika:

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

Na kraju, možemo koristiti "+=” da biste dodali nove stavke na popis. U usporedbi s drugim pristupima, ovaj operator stvara novi objekt popisa i dodjeljuje ga varijabli popis:

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

5. Ažuriranje stavki na popisu

Stavke na popisu možemo ažurirati koristeći doslovnu sintaksu ili postavi () metoda:

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

U ovom su primjeru stavke u indeksu 1 i 2 ažurirane novim vrijednostima.

6. Uklanjanje predmeta sa popisa

Stavku s određenim indeksom možemo ukloniti pomoću ukloniti() metoda:

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

Ili također možemo ukloniti element pomoću removeElement () metoda. Ovo uklanja prvo pojavljivanje elementa s popisa:

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

Dodatno, možemo koristiti minus operator za uklanjanje svih pojavljivanja elementa s popisa. Ovaj operater, međutim, ne mutira temeljni popis - on vraća novi popis:

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

7. Iteracija na popisu

Groovy je dodao nove metode na postojeću Javu Zbirke API. Ove metode pojednostavljuju operacije poput filtriranja, pretraživanja, sortiranja, agregiranja itd. Enkapsulacijom koda tipa. Također podržavaju širok raspon ulaza, uključujući zatvaranje i izlazne strukture podataka.

Krenimo od gledanja dviju metoda za ponavljanje popisa.

The svaki() metoda prihvaća zatvaranje i vrlo je slična metodi za svakoga() metoda u Javi. Groovy prolazi implicitni parametar to što odgovara trenutnom elementu u svakoj iteraciji:

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

Druga metoda, eachWithIndex () pruža trenutnu vrijednost indeksa uz trenutni element:

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

8. Filtriranje

Filtriranje je još jedna operacija koja se često izvodi na popisima, a Groovy nudi mnogo različitih metoda koje možete odabrati.

Definirajmo popis na kojem ćemo raditi:

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

Da bismo pronašli prvi objekt koji odgovara stanju koji možemo koristiti pronaći:

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

Da bismo pronašli sve objekte koji odgovaraju stanju koje možemo koristiti pronađi sve:

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

Pogledajmo još jedan primjer. Ovdje želimo popis svih elemenata koji su brojevi:

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

Alternativno, možemo koristiti grep način da se učini isto:

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

Razlika između grep i pronaći metode je to grep može prihvatiti Objekt ili a Zatvaranje kao argument. Dakle, omogućuje daljnje smanjivanje izjave o stanju na najmanji minimum:

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

Dodatno, grep koristi Objekt # je slučaj (java.lang.Object) za procjenu stanja na svakom elementu popisa.

Ponekad možda će nas zanimati samo jedinstveni predmeti s popisa. U tu svrhu možemo koristiti dvije preopterećene metode.

The jedinstveno () metoda po želji prihvaća zatvaranje i na osnovnom popisu zadržava samo elemente koji odgovaraju uvjetima zatvaranja, a druge odbacuje. Uobičajeno koristi prirodni poredak za određivanje jedinstvenosti:

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

Alternativno, ako zahtjev nije mutiranje temeljnog popisa, tada možemo koristiti toUnique () metoda:

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

Ako želimo provjeriti ispunjavaju li neke ili sve stavke s popisa određeni uvjet, možemo koristiti svaki() i bilo koji () metode.

The svaki() metoda procjenjuje stanje u zatvaranju prema svakom elementu s popisa. Tada se samo vraća pravi ako svi elementi na popisu zadovoljavaju uvjet:

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

The bilo koji () metoda se, s druge strane, vraća pravi ako bilo koji element na popisu zadovoljava uvjet:

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

9. Sortiranje

Prema zadanim postavkama Groovy sortira stavke na popisu na temelju njihovog prirodnog poredaka:

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

Ali također možemo proći a Usporednik s prilagođenom logikom sortiranja:

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

Uz to možemo koristiti i min () ili maks. () metode za pronalaženje maksimalne ili minimalne vrijednosti bez izričitog poziva vrsta():

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

10. Skupljanje

Ponekad ćemo možda htjeti izmijeniti stavke na popisu i vratiti drugi popis s ažuriranim vrijednostima. To se može učiniti pomoću prikupiti() metoda:

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

11. Pridruživanje

Ponekad ćemo možda morati pridružiti stavke na popisu. Da bismo to učinili možemo pridružiti() metoda:

assertTrue (["One", "Two", "Three"]. join (",") == "Jedan, dva, tri")

12. Zaključak

U ovom smo članku pokrili nekoliko proširenja koja Groovy dodaje Javi Zbirke API.

Počeli smo gledajući doslovnu sintaksu, a zatim njezinu upotrebu u stvaranju, ažuriranju, uklanjanju i dohvaćanju stavki s popisa.

Konačno, pogledali smo Groovyjevu podršku za ponavljanje, filtriranje, pretraživanje, prikupljanje, pridruživanje i sortiranje popisa.

Kao i uvijek svi primjeri raspravljeni u članku dostupni su na GitHubu.