Andmed Javas Massiiv Andmeid hoitakse lihttüüpidena, vajadusel grupeeritakse neid selguse huvides struktuurtüüpidesse. Ühetüübiliste või ühest ülemklassist alanevat tüüpi andmeid saab hoida massiivis. Massiivi andmete töötlemiseks on loodud paketti java.util klass Arrays. Seal olevate meetodite abil on võimalik massiivi sortida, massiivist sobivat elementi leida, massiivi määratud väärtusega täita ning kaht massiivi võrrelda. Järgnev näide kirjutab sorteeritutena välja käsurea parameetritena antud sõnad. Lisaks teatatakse sõna "kass" asukoht massiivis või selle puudumine. import java.util.*; public class Sort2 { public static void main(String args[]) { Arrays.sort(args); for(int i=0; i=0){ System.out.println("Massiiviis asub "+otsitav+ " kohal nr. "+koht); } else{ System.out.println(otsitav+" puudub massivist"); } } } Sorteerimiseks on käsk sort. Samanimelise meetodiga võib sorteerida nii sõnesid, täisarve, reaalarve, kui igasugu muid objekte, st. nii liht- kui struktuurtüüpe. Sorteerides tõstetakse massiivi sees elemendid ringi. Sorteerimisalgoritmiks on kiirsortimise ning shell-sortimise vahepealne algoritm, kus sorteerimata algandmete korral ei kulu sortimiseks aega enam kui n*log(n), samas aga eelnevalt sorditud andmete korral töötab tunduvalt kiiremini. Sama väärtusega elementide järjekord jääb ka pärast sorteerimist samaks. Lihttüüpide korral võrreldakse andmete väärtusi, liittüüpide korral kasutatakse compareTo meetodit, eeldades, et massiivis asuvaid elemente on võimalik omavahel võrrelda. Probleemi tekkimisel heidetakse meetodist välja erind. Kui andmeid ei saa omavahel compareTo abil võrrelda või annab see kasutaja jaoks soovimatu tulemuse, siis saab kirjutada ise liidest Comparator realiseeriva klassi mille abil massiivis olevaid elemente võrrelda. Nii tuleks näiteks teha, kui soovime, et nimede tähestiku järjekorda seadmisel arvestataks täpitähti õigesti. Otsimiseks on meetod binarySearch, mis eeldab massiivi eelnevat sorditust. Massiivi andmetega täitmiseks on meetod fill ning kaht massiivi aitab võrrelda equals. Java Collections Framework Lisaks massiivile on Java keeles ka muid vahendeid andmete hoidmiseks ja töötlemiseks. Mitmetes masinalähedasemates programmeerimiskeeltes aitavad andmetega kiiremini ja paindlikumalt ümber käia viidad, siin asendavad neid osutid. Et programmeerijad saaksid paremini ja paremaid programme kirjutada, selleks on loodud andmehulkade hoidmist ning nendega manipuleerimist kirjeldav liideste kogum, Java Collections Framework. Liidesed on kaetud klassidega, kuid neid saab vajadusel ise luua ning tõenäoliselt luuakse ka Java arendajate poolt valmis liidestele konkreetsetesse oludesse klasse juurde. Java loojad pakuvad välja Collections Framework'i kasutamisel välja järgmised eelised. Programmeerimise kiirus kasvab, kuna ei tule pidevalt luua uusi klasse eri tüüpi andmega tegelemiseks ega andmete muundamiseks. Ka programmi enese kiirus peaks kasvama, kuna optimiseeritud valmisklasside kasutamisel ei pea nende kallal enam vaeva nägema, samas aga on kindlasti võimalik vabaneva ajaga ülejäänud programmi paremaks teha. Selge süsteem võimaldab kergemini andmeid vahetada teiste programmidega. Õppimine ning ajaga kaasas käimine peaks minema lihtsamaks, kuna põhilised osad jäävad samade liideste kasutamisel ka erinevatel andmetel samaks. Uue andmetöötlussüsteemi välja töötamisel saab olemasolevad liidesed aluseks võtta, kuna neis on juba läbikaalutud meetodid olemas. Suuremas plaanis suurendab ühtne liideste komplekt programmi taaskasutust, sest siis on kergem ennustada, mida ühelt või teiselt programmijupilt oodata võib. Loomulikult on aga ühtsel süsteemil omad puudused. Mõnes olukorras on ta kohmakam, sest harva on võimalik optimiseerida sama hästi erinevate ootuste jaoks kui seda saaks ühe kindla eesmärgi jaoks teha. Samas aga on ehk korralik kombain parem kui ülejala tehtud ning läbi kontrollimata vahend. Tavanäiteks võiks olla, et kärbsepiits-klopper-pudeliavajaga on raskem kärbest kinni püüda kui lihtsa viimistletud kärbsepiitsaga, kuid tõenäoliselt hulga tulemuslikum kui tavalise tolmulapiga, mis meil enamasti juhtub käepärast olema. Kollektsioon Andmeliideste juureks on Collection, igasugune andmekogum. Kirjeldatud on mõniteist meetodit, mida nende andmetega teha saab. Meedodi add abiga saab elemendi lisada, remove võtab vastava elemendi kollektsioonist ära; addAll lisab terve teise kollektsiooni, clear teeb platsi puhtaks; saab kontrollida, kas kollektsioon on tühi, kui palju temas on elemente, kas temas leidub määratud objekt, kas temas sisaldub teine kollektsioon või on ta hoopistükkis teisega samaväärne. Vastavad meetodid oleksid isEmpty, size, contains, containsAll ja equals. Kollektsioonist saab andmeid kätte, muundades ta massiiviks või küsides temalt objektijada tüübist Iterator. Selle abil saab ükshaaval läbi vaadata kõik kollektsiooni elemendid, vajadusel küsides osuti vajalikule elemendile või eemaldades ta kollektsioonist. Nimistu List on järjestatud kollektsioon, ehk selline andmekogum, kus igal elemendil on järjekorranumber. Ta on kollektsiooni alamliideseks. Juurde tulevad meetodid, mis on seotud järjekorranumbriga. Näiteks saab lisada elementi määratud kohale, samuti eemaldada või küsida teda sealt. Elemendi lisamisel temast paremale jääjate järjekorranumber suureneb ühe võrra, eemaldamisel väheneb. Kui sooviksime massiivi keskele lisada, peaksime vastava algoritmi ise kirjutama, Listi ehk nimekirja puhul on see juba olemas. Massiivi saab nimekirjaks muuta klassi Arrays käsuga asList, vastupidi saab aga nimekirjale öeldes toArray(). Kui massiivis asuvad elemendid enamjaolt üksteise järel ning nende asetsemist mälus saab muuta üksnes intepretaator või operatsioonisüsteem, siis List on vaid liides ning tema realisatsioonis saab vabalt määrata, kas elemente hoitakse osutite abil teineteisele viidates, massiivis või hoopis mõnel muul moel (kas või näiteks faili abi kasutades). Liides List on vaid kirjeldus, kuidas andmetele ligi pääseb. Hulk Set on samuti kollektsiooni alamliides. Temas võib iga väärtusega elementi olla vaid üks nagu matemaatilises hulgas kohane. Liides Set ei ütle aga midagi elementide järjekorra kohta. Temasse lisades jäävad alles vaid erinevad elemendid. Nii saab tema abil kergesti suurest komplektist erinevad välja sõeluda. SortedSet on Set'i alamliides. Nagu nimigi ütleb, on temas elemendid järjestatud. Lisaks muule Set'i võimalustele saab temalt küsida esimest ja viimast elementi, samuti alamhulki alates või kuni mingi väärtuseni ning hulka kahe väärtuse vahelt. Nagu klass Arrays sisaldab meetodeid massivi töötlemiseks, nii klassi Collections meetodid aitavad ümber käia kollektsiooni ning tema alanejatega. Saab leida kollektsioonist vähimat ning suurimat elementi, muuta kollektsioon sünkroniseerituks (s.t. et tema poole saab korraga pöörduda vaid üks lõim) või keelata temasse kirjutamine. Klassi aitab sorteerida listi, samuti sorteeritud listis elemente segi paisata (meetod shuffle). Võib keerata järjekorra vastupidiseks, täita nimekirja määratud elemendiga või otsida elementi. Tegelikud realisatsioonid Et programmeerija ei peaks vaid ilusaid kirjeldusi vaatama, vaid saaks ka välja pakutud hüvesid ise neid loomata maitsta, selleks on loodud liidesed ka realiseeritud. Kollektsiooni realiseerijaks on küll vaid AbstractCollection, mis mõeldud aitamaks ise kollektsiooni luua, kuid muudele liidestele on kasutatavad katted olemas. Listi realiseerijateks on määratud LinkedList, Vector ning ArrayList. Kasutaja jaoks käituvad nad ühtmoodi nii, nagu liideses kirjeldatud, sisimas aga on erinevad ning suuremate andmehulkade korral on kasulik nende eripära arvestada. LinkedList on jadas paiknevate elementide kogum, igalt elemendil (v.a. viimane) on osuti järgmisele. Sellise lahenduse juures on suhteliselt kerge elemente keskele vahele panna, sest piisab vaid kahe (pandava ning temale eelneva) elemendi ümber tõstmisest. Samas on pika jada keskele jõudmine suhteliselt vaevarikas, sest tuleb kõik vahepeal asuvad elemendid läbi käia, et otsitu juurde jõuda. Vector ning ArrayList hoiavad oma andmeid massiivis. Andmetele on lihtne ligi pääseda, kuid eemaldamiseks või lisamiseks tuleb kõiki muudetavast taga pool paiknejaid ühe võrra liigutada, mis jällegi suuremate andmete puhul päris palju operatsioone nõuab. Samuti saab järjest andmeid lisades ükskord massiiv lihtsalt täis. Sellisel puhul luuakse uus suurem massiiv ning kopeeritakse andmed sinna. Et andmete lisamisel ümber kopeerimist liialt tihti ette ei tuleks, selleks luuakse igal korral vähemalt Vectori puhul eelmisest kaks korda suurem massiiv. Set-liidese realiseerijaks on HashSet ning SortedSet võimalusi aitab kasutada TreeSet. Järgnevas näites luuakse alustuseks loomanimedest sõnemassiiv. Massiiv muudetakse Vector'iks, mis realiseerib liidest List. Nagu nimistule kohane, saab temasse andmeid soovitud kohta lisada ning sealt eemaldada. Siin paigutatakse kohale nr. 2 (ehk kolmandaks) rebane. Väljatrükil on näha, et parempoolsed elemendid on ühe võrra edasi nihkunud. Nimistu muudetakse HashSeti abil hulgaks. Väljatrükil on näha, et korduv koer on kadunud. Ka muud elemendid on oma kohta vahetanud, kuid see on lubatud, sest hulgas pole elementide järjekord määratud. Lisades kitse ja lamba, tuleb juurde vaid kits, sest lammas oli hulgas juba olemas. Hulga sorteerimiseks paigutame andmed isendisse tüübist TreeSet. Selles klassis jäävad andmed sordituks ka pärast uute elementide lisamist. import java.util.*; public class Andmed{ public static void main(String argumendid[]){ String loomamassiiv[]={"kass", "koer", "lammas", "koer", "ahv"}; List loomalist=new Vector(Arrays.asList(loomamassiiv)); loomalist.add(2, "rebane"); System.out.println(loomalist); Set loomahulk=new HashSet(loomalist); System.out.println(loomahulk); loomahulk.add("kits"); loomahulk.add("lammas"); System.out.println(loomahulk); SortedSet sorteeritudLoomahulk=new TreeSet(loomahulk); System.out.println(sorteeritudLoomahulk); sorteeritudLoomahulk.add("antiloop"); System.out.println(sorteeritudLoomahulk); } } Ning programmi töö tulemus: [kass, koer, rebane, lammas, koer, ahv] [ahv, lammas, kass, rebane, koer] [ahv, kits, lammas, kass, rebane, koer] [ahv, kass, kits, koer, lammas, rebane] [ahv, antiloop, kass, kits, koer, lammas, rebane] Objektipaaride jaoks on loodud liidesed Map ning SortedMap. Neid realiseerivate klasside HashMap ning TreeMap abil saab võtmetele panna vastama väärtused, küsida võtmetele vastavaid väärtusi. Neid saab kasutada nagu sõnaraamatut.