Erinevus lehekülje "Java:Kogumid" redaktsioonide vahel

Allikas: Kursused
Mine navigeerimisribale Mine otsikasti
110. rida: 110. rida:
 
</source>
 
</source>
  
 +
== Hulk ==
 +
 +
Hulk (ingl ''set'') ei sisalda elementide kordusi. Hulk pole järjestatud - elementide küsimine hulgast võib iga kord anda erineva järjestuse. Javas on järjekordselt palju erinevaid hulkasid, vaatleme siinkohal <code>HashSet</code> kogumit.
 +
 +
=== HashSet ===
 +
 +
Hulka saab lisada elemente. Korduva elemendi lisamisel uut elementi ei lisata. Tulemusena on hulk, kus igat elementi on maksimaalselt 1.
 +
 +
Koodinäide:
 +
<source lang="java">
 +
HashSet<Integer> set = new HashSet<Integer>();
 +
 +
// lisame kaks elementi
 +
set.add(1);
 +
set.add(2);
 +
System.out.println(set.size());
 +
// lisame veel ühe (korduva elemendi)
 +
set.add(1);
 +
System.out.println(set.size());
 +
 +
// aga kus on set.get(1)?
 +
 +
/*
 +
* Set on kogum, millel puudub järjekord.
 +
* Seetõttu pole ka defineeritud, milline element on esimene,
 +
* milline on teine jne. Seega elemente ei saa indeksi järgi küsida.
 +
* Aga kuidas printida välja kõik elemendid?
 +
* Siin on üks näide, kuidas seda teha läbi massiivi.
 +
*/
 +
// muudame hulga massiiviks:
 +
 +
// toArray võtab argumendiks massiivi ning kasutab
 +
// väljundmassiivina sama tüüpi massiivi.
 +
// kuigi sisendiks on massiiv, mille pikkus on 0,
 +
// siis väljundis on automaatselt nii pikk massiiv,
 +
// et kõik elemendid mahuks ära.
 +
Integer[] numbers = set.toArray(new Integer[0]);
 +
 +
// for-each tüüpi tsükkel
 +
for (int n : numbers) {
 +
System.out.println(n);
 +
}
 +
</source>
 
[[Category:Java juhend|Kogumid]]
 
[[Category:Java juhend|Kogumid]]

Redaktsioon: 2. märts 2015, kell 23:50

Kogumid (ingl Collections) on andmestruktuurid, mis hoiavad objektide hulka.

Massiiv

Massiiv (array) on kõige lihtsam kogumitüüp. Peaaegu kõik teised kogumid saab realiseerida massiivide peal (ja seda paljud reaalselt ka kasutavad). Massiiv on fikseeritud pikkusega kogum - peale massiivi loomist pikkust enam muuta ei saa. Massiivi kõik elemendid peavad olema sama tüüpi (või alamtüüpi). Massiivis saab kasutada ka primitiivseid andmetüüpe elementidena.

Elementide indeksid hakkavad 0-st. Ehk siis massiivi esimese elemendi indeks on 0 jne.

Massiiv on tegelikult objekt, aga kuna seda kasutatakse väga tihti, siis massiiviga opereerimiseks on loodud erandlik süntaks.

Massiivi esimene element massiiv[0]

Massiivi pikkus massiiv.length

Massiivi viimane element massiiv[massiiv.length - 1]

Koodnäide:

<source lang="java"> int[] massiiv = new int[10]; massiiv[0] = 1; massiiv[9] = 10; //massiiv[10] ei mahu enam massiivi, kuna on 11. element

System.out.println(massiiv[0]); // 1 System.out.println(massiiv[1]); // 0 - int massiivi element on vaikimisi 0

// algväärtustame 1..10 for (int i = 0; i < massiiv.length; i++) { massiiv[i] = i + 1; // indeks liigub 0..9, väärtused 1..10 } // leiame elementide summa int sum = 0; for (int i = 0; i < massiiv.length; i++) { sum = sum + massiiv[i]; } System.out.println("Massiivi elementide summa: " + sum); </source>

Sõne massiivid: <source lang="java"> String[] nimed = {"Mati", "Kati", "Jüri"}; String otsi = "Jüri"; boolean found = false; for (int i = 0; i < nimed.length; i++) { if (otsi.equals(nimed[i])) { System.out.println(otsi + " leitud! indeks: " + i); found = true; break; // lõpetame otsimise ära } } // for-each tüüpi tsükkel: for (String s : nimed) { System.out.println(s); } if (!found) { System.out.println("Nime " + otsi + " ei leitud."); } </source>

Geneerilised tüübid

Nagu massiivi puhul nägime, hoitakse selles konkreetset tüüpi elemente (kõik näiteks int või String). Sarnaselt on järgmiste kogumite juures vaja märkida, millst tüüpi elemente kogumis hoitakse. Kogumites hoitakse ainult objekte, ehk siis primitiivseid andmetüüpe (nagu int või double) järgnevalt näidatavates kogumites hoida ei saa. Selle asemel tuleb kasutada näiteks vastavaid objekte: Integer või Double. Geneeriline tüüp (ehk geneerik) märgitakse < ja > märkide vahele. Näiteks List<Integer> või Set<String>.

Loend

Loend (list) on korrastatud (järjekord säilib) andmekogum. Kui lisada elemendid loendisse, siis hiljem on nad lugemisel täpselt samas järjekorras kui neid sisestati.

Javas on implementeeritud erinevaid loendeid. Kirjelame siin ArrayList tüüpi loendit.

ArrayList

ArrayList on dünaamiline massiv. Tüütab suuresti nagu massiiv (on sisemiselt realiseeritud massiiviga), kuid pikkus on dünaamiline. Ehk siis ArrayList'i loomise hetkel ei pea teadma, palju loendisse on vaja lisada. Loend suureneb ise vastavalt vajadusele.

Koodinäide:

<source lang="java"> ArrayList<Integer> numbrid = new ArrayList<Integer>(); numbrid.add(1); numbrid.add(2); System.out.println(numbrid.size()); // 2

numbrid.add(3); numbrid.add(4); // loend: 1, 2, 3, 4 System.out.println(numbrid.size()); // 4

System.out.println(numbrid.get(1)); // 2

numbrid.remove(1); // element indeksiga 1 eemaldatakse // ülejäänud loendi elemendid liigutatakse ühe võrra ettepoole: // loend: 1, 3, 4

numbrid.add(1, 2); // lisame elemendi "2" positsioonile 1 // kõik elemendid indeksiga 1 või suuremad nihutatakse ühe võrra edasi: // loend: 1, 2, 3, 4

numbrid.set(1, 7); // asendame elemendi väärtuse positsioonil 1: // loend: 1, 7, 3, 4

numbrid.clear(); // tühjendame // numbrid 1..10 for (int i = 0; i < 10; i++) { numbrid.add(i + 1); } // prindime välja for (int i = 0; i < numbrid.size(); i++) { System.out.println(numbrid.get(i)); } </source>

Hulk

Hulk (ingl set) ei sisalda elementide kordusi. Hulk pole järjestatud - elementide küsimine hulgast võib iga kord anda erineva järjestuse. Javas on järjekordselt palju erinevaid hulkasid, vaatleme siinkohal HashSet kogumit.

HashSet

Hulka saab lisada elemente. Korduva elemendi lisamisel uut elementi ei lisata. Tulemusena on hulk, kus igat elementi on maksimaalselt 1.

Koodinäide: <source lang="java"> HashSet<Integer> set = new HashSet<Integer>();

// lisame kaks elementi set.add(1); set.add(2); System.out.println(set.size()); // lisame veel ühe (korduva elemendi) set.add(1); System.out.println(set.size());

// aga kus on set.get(1)?

/*

* Set on kogum, millel puudub järjekord.
* Seetõttu pole ka defineeritud, milline element on esimene,
* milline on teine jne. Seega elemente ei saa indeksi järgi küsida.
* Aga kuidas printida välja kõik elemendid?
* Siin on üks näide, kuidas seda teha läbi massiivi.
*/

// muudame hulga massiiviks:

// toArray võtab argumendiks massiivi ning kasutab // väljundmassiivina sama tüüpi massiivi. // kuigi sisendiks on massiiv, mille pikkus on 0, // siis väljundis on automaatselt nii pikk massiiv, // et kõik elemendid mahuks ära. Integer[] numbers = set.toArray(new Integer[0]);

// for-each tüüpi tsükkel for (int n : numbers) { System.out.println(n); } </source>