Uvod u PCollections
1. Pregled
U ovom ćemo članku pogledati PCollections, a Java knjižnica pruža trajne, nepromjenjive zbirke.
Trajne strukture podataka (zbirke) ne mogu se izravno mijenjati tijekom postupka ažuriranja, već se vraća novi objekt s rezultatom postupka ažuriranja. Oni su ne samo nepromjenjivi već i ustrajni - što znači da nakon izvršene modifikacije, prethodne verzije zbirke ostaju nepromijenjene.
PCollections je analogan i kompatibilan s okvirom Java Collections.
2. Ovisnosti
Dodajmo sljedeću ovisnost na našu pom.xml za nas da koristimo PCollections u našem projektu:
kolekcije org. kolekcija 2.1.2
Ako se naš projekt temelji na Gradleu, možemo dodati isti artefakt našem graditi.gradle datoteka:
sastaviti 'org.pcollections: pcollections: 2.1.2'
Najnoviju verziju možete pronaći na Maven Central.
3. Struktura karte (HashPMap)
HashPMap je postojana struktura podataka karte. To je analog za java.util.HashMap koristi se za pohranu ne-null podataka ključ / vrijednost.
Možemo instancirati HashPMap uporabom prikladnih statičkih metoda u HashTreePMap. Ove statičke metode vraćaju a HashPMap instancu iza koje stoji IntTreePMap.
Statički prazan() metoda HashTreePMap klasa stvara prazan HashPMap koji nema elemente - baš kao i korištenje zadanog konstruktora za java.util.HashMap:
HashPMap pmap = HashTreePMap.empty ();
Postoje dvije druge statičke metode koje možemo koristiti za stvaranje HashPMap. The jednokrevetna () metoda stvara a HashPMap sa samo jednim unosom:
HashPMap pmap1 = HashTreePMap.singleton ("key1", "value1"); assertEquals (pmap1.size (), 1);
The iz() metoda stvara a HashPMap od postojećeg java.util.HashMap instanci (i drugo java.util.Map implementacije):
Karta karte = novi HashMap (); map.put ("mkey1", "mval1"); map.put ("mkey2", "mval2"); HashPMap pmap2 = HashTreePMap.from (karta); assertEquals (pmap2.size (), 2);
Iako HashPMap nasljeđuje neke metode od java.util.Apstraktna karta i java.util.Map, ima metode koje su njemu svojstvene.
The minus() metoda uklanja jedan unos s karte dok minusSve () metoda uklanja više unosa. Tu je i plus() i plusSve () metode koje dodaju pojedinačne i višestruke unose:
HashPMap pmap = HashTreePMap.empty (); HashPMap pmap0 = pmap.plus ("key1", "value1"); Karta karte = novi HashMap (); map.put ("key2", "val2"); map.put ("key3", "val3"); HashPMap pmap1 = pmap0.plusAll (karta); HashPMap pmap2 = pmap1.minus ("ključ1"); HashPMap pmap3 = pmap2.minusAll (map.keySet ()); assertEquals (pmap0.size (), 1); assertEquals (pmap1.size (), 3); assertFalse (pmap2.containsKey ("key1")); assertEquals (pmap3.size (), 0);
Važno je napomenuti da pozivanje staviti() na pmap bacit će UnsupportedOperationException. Budući da su objekti PCollections trajni i nepromjenjivi, svaka operacija mijenjanja vraća novu instancu objekta (HashPMap).
Idemo dalje na druge strukture podataka.
4. Struktura popisa (TreePVector i ConsPStack)
TreePVector je trajni analog java.util.ArrayList dok ConsPStack je analogni java.util.LinkedList. TreePVector i ConsPStack imaju prikladne statičke metode za stvaranje novih primjeraka - baš kao HashPMap.
The prazan() metoda stvara prazno TreePVector, dok jednokrevetna () metoda stvara a TreePVector sa samo jednim elementom. Tu je i iz() metoda koja se može koristiti za stvaranje instance TreePVector od bilo kojeg java.util.Zbirka.
ConsPStack ima statičke metode s istim imenom koje postižu isti cilj.
TreePVector ima metode za manipulaciju njime. Ima minus() i minusSve () metode uklanjanja elemenata; the plus(), i plusSve () za dodavanje elemenata.
The s() koristi se za zamjenu elementa na navedenom indeksu, a podlista () dobiva niz elemenata iz kolekcije.
Te su metode dostupne u ConsPStack također.
Razmotrimo sljedeći isječak koda koji ilustrira gore spomenute metode:
TreePVector pVector = TreePVector.empty (); TreePVector pV1 = pVector.plus ("e1"); TreePVector pV2 = pV1.plusAll (Arrays.asList ("e2", "e3", "e4")); assertEquals (1, pV1.size ()); assertEquals (4, pV2.size ()); TreePVector pV3 = pV2.minus ("e1"); TreePVector pV4 = pV3.minusAll (Arrays.asList ("e2", "e3", "e4")); assertEquals (pV3.size (), 3); assertEquals (pV4.size (), 0); TreePVector pSub = pV2.subList (0, 2); assertTrue (pSub.contens ("e1") && pSub.contains ("e2")); TreePVector pVW = (TreePVector) pV2.with (0, "e10"); assertEquals (pVW.get (0), "e10");
U isječku koda gore, pSub je drugo TreePVector objekt i neovisan je o pV2. Kao što se može primijetiti, pV2 nije promijenio podlista () operacija; nego nova TreePVector objekt je stvoren i ispunjen elementima pV2 od indeksa 0 do 2.
To se podrazumijeva pod nepromjenjivošću i događa se sa svim modificirajućim metodama PCollections.
5. Postavite strukturu (MapPSet)
MapPSet je uporan, zaštićen mapama, analogni java.util.HashSet. Može se povoljno instancirati statičkim metodama HashTreePSet - prazan(), iz() i jednokrevetna (). Oni funkcioniraju na isti način kao što je objašnjeno u prethodnim primjerima.
MapPSet ima plus(), plusSve (), minus() i minusSve () metode za manipulaciju skupljenim podacima. Nadalje, nasljeđuje metode od java.util.Set, java.util.ApstractCollection i java.util.AbstractSet:
MapPSet pSet = HashTreePSet.empty () .plusAll (Arrays.asList ("e1", "e2", "e3", "e4")); assertEquals (pSet.size (), 4); MapPSet pSet1 = pSet.minus ("e4"); assertFalse (pSet1.contens ("e4"));
Napokon, tu je i NaručenPSet - koji održava redoslijed umetanja elemenata baš kao java.util.LinkedHashSet.
6. Zaključak
U zaključku smo u ovom brzom vodiču istražili PCollections - postojane podatkovne strukture koje su analogne temeljnim zbirkama koje imamo na raspolaganju na Javi. Naravno, PCollections Javadoc pruža više uvida u zamršenost knjižnice.
I, kao i uvijek do sada, cjeloviti kod možete pronaći na Githubu.