I200:Muutujad: Difference between revisions
No edit summary |
|||
(48 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
[[File:Muutujad.png|400px|right]] | |||
Muutuja on sisuliselt nagu kast, kuhu asju sisse panna. Java nõuab, et kastil oleks nimi ja tüüp. Nimeks pane mida ise soovid, et ära tunneks | Muutuja on sisuliselt nagu kast, kuhu asju sisse panna. Java nõuab, et sellel kastil oleks nimi ja tüüp. Nimeks pane mida ise soovid, et sa ise ära tunneks ja tüüpidest räägime all pikemalt. | ||
Näiteks | Näiteks kui soovime lapse vanust salvestada, siis sobib selleks int (integer, ehk täisarv) tüüp ja "vanus" nimi: | ||
int | |||
Kui | [[File:Muutuja.png|200px]] | ||
String | |||
Seda kirjutaksime Javas järgnevalt: | |||
<syntaxhighlight lang="Java"> | |||
int vanus = 5; | |||
</syntaxhighlight> | |||
Kui sooviksin selle lapse nime salvestada, kasutaksin tüüpi String, ehk sõne: | |||
<syntaxhighlight lang="Java"> | |||
String nimi = "Mikk"; | |||
</syntaxhighlight> | |||
Väikese tähega andmetüübid (int) on primitiivid ja suure tähega (String) on objektid. Vahe on selles, et primitiivne tüüp salvestab lihtsaid andmeid nagu arv või täht, aga objektid salvestavad keerulisemaid andmeid nagu lause. Teine erinevus on see, et objektidel on omad meetodid, mis lihtsustavad toiminguid. Primitiivsetel tüpidel tuleb kasutada abistavaid klasse. | Väikese tähega andmetüübid (int) on primitiivid ja suure tähega (String) on objektid. Vahe on selles, et primitiivne tüüp salvestab lihtsaid andmeid nagu arv või täht, aga objektid salvestavad keerulisemaid andmeid nagu lause. Teine erinevus on see, et objektidel on omad meetodid, mis lihtsustavad toiminguid. Primitiivsetel tüpidel tuleb kasutada abistavaid klasse. | ||
== | [[File:Objekt.png]] | ||
Andmetüüpe on kahte sorti. Ühed salvestavad [[#Üksik väärtus|ühe ainsa väärtuse]], teised aga [[#Kogumik väärtusi|kogumiku väärtusi]]. | |||
__TOC__ | |||
= Üksik väärtus = | |||
== Sissejuhatus == | |||
Üldiselt kasutad täisarvude jaoks <code>int</code> tüüpi muutujaid, komakohaga arvude jaoks <code>double</code> ja ülejäänud läheb sõne, ehk <code>String</code> sisse. Kuid võimalusi on veel. | |||
== Andmetüüpide võrdlus == | |||
=== | {| border="1" style="border-collapse:collapse" | ||
! | |||
! style="font-size: 1.3em; padding: 1em;" | hoitav väärtus | |||
! style="font-size: 1.3em; padding: 1em;" | näide | |||
! style="font-size: 1.3em; padding: 1em;" | kuidas uus luua | |||
! style="font-size: 1.3em; padding: 1em;" | liitmine | |||
|- | |||
! style="font-size: 2em; padding: 1em;" | byte | |||
| style="text-align: center" | väikesed arvud<br/>(alates -128 kuni 127) | |||
| style="text-align: center" | 25 | |||
| style="text-align: center" | byte a = 25; | |||
| style="text-align: center" | byte b = (byte) (34 + 3); | |||
|- | |||
! style="font-size: 2em; padding: 1em;" | int | |||
| style="text-align: center" | täisarvud<br/>(alates -2'147'483'648 kuni 2'147'483'647) | |||
| style="text-align: center" | 54 | |||
| style="text-align: center" | int a = 54; | |||
| style="text-align: center" | int a = 34 + 45; | |||
|- | |||
! style="font-size: 2em; padding: 1em;" | float | |||
| style="text-align: center" | reaalarvud<br/>(alates 1.4*10^-45 kuni 3.4*10^38) | |||
| style="text-align: center" | 3 | |||
| style="text-align: center" | float a = 3; | |||
| style="text-align: center" | float a = 34 + 45; | |||
|- | |||
! style="font-size: 2em; padding: 1em;" | double | |||
| style="text-align: center" | reaalarvud (komakohaga)<br/>(alates 4.9*10^-324 kuni 1.79*10^308) | |||
| style="text-align: center" | 65.34 | |||
| style="text-align: center" | double a = 65.34; | |||
| style="text-align: center" | double a = 34 + 45; | |||
|- | |||
! style="font-size: 2em; padding: 1em;" | BigDecimal | |||
| style="text-align: center" | kõik arvud.<br/>BigDecimal on vajalik, et täpseid arvutusi teha.<br/>NB! Et arvutused oleksid täpsed, peavad arvud olema jutumärkides, ehk sõne kujul.<br/>(arvu suurust limiteerib vaid arvuti mälu) | |||
| style="text-align: center" | BigDecimal("432.76") | |||
| style="text-align: center" | BigDecimal a = new BigDecimal("432.76"); | |||
| style="text-align: left" | | |||
BigDecimal a = new BigDecimal("2"); | |||
BigDecimal b = new BigDecimal("2"); | |||
a = a.add(b); // liitmine | |||
|- | |||
! style="font-size: 2em; padding: 1em;" | char | |||
| style="text-align: center" | üks täht | |||
| style="text-align: center" | 't' | |||
| style="text-align: center" | char a = 't'; | |||
| style="text-align: center" | char a = 't' + 'a'; // a = Õ | |||
|- | |||
! style="font-size: 2em; padding: 1em;" | String | |||
| style="text-align: center" | Sõne, ehk jutumärkide vahele saab panna kõiki sümboleid | |||
| style="text-align: center" | "Tere" | |||
| style="text-align: center" | String a = "Tere"; | |||
| style="text-align: center" | String a = "Tere, " + "hommikust!"; | |||
|- | |||
! style="font-size: 2em; padding: 1em;" | boolean | |||
| style="text-align: center" | true või false | |||
| style="text-align: center" | true | |||
| style="text-align: center" | boolean a = true; | |||
| style="text-align: center" | boolean a = true && false; // false<br/> | |||
boolean a = true || false; // true | |||
|- | |||
! style="font-size: 2em; padding: 1em;" | Object | |||
| style="text-align: center" | keerulisemad objektid, nagu ArrayList | |||
| style="text-align: center" | [34, "ArrayList", 47.5] | |||
| style="text-align: center" | ArrayList a = new ArrayList(); | |||
| style="text-align: center" | kui objekt toetab siis on tal selleks oma meetod | |||
|} | |||
== Ohukohad == | |||
==== | ==== Ettevaatust 1: Arvu miinimum ja maksimum ==== | ||
Igal arvu andmetüübil on oma miinimum ja maksimum võimalik arv, mida andmetüüp suudab hoida. Näiteks kui sul on <byte a = 127>, siis <a + 1> toob tulemuseks -128, sest arv jätkub teisest otsast. | Igal arvu andmetüübil on oma miinimum ja maksimum võimalik arv, mida andmetüüp suudab hoida. Näiteks kui sul on <byte a = 127>, siis <a + 1> toob tulemuseks -128, sest arv jätkub teisest otsast. | ||
==== Ettevaatust 2: Arvutused ei ole alati täpsed ==== | |||
= | Võtame lihtsa tehte: 2.0 - 1.1 = 0.9. Ainult, et tegelikult tuleb Javas vastuseks 0.899999999999999. Kohati uskumatu, et selline viga on sees. Seda esineb ka teistes riistvaralähedastest keeltes. | ||
Näide kuidas 2.0 - 1.1 korrektselt ära teha. Pane tähele, et arvud on jutumärkide sees, ilma nendeta tuleksid ikka valed vastused. | Lahenduseks on kas kasutada int tüüpi muutujaid (näiteks 23.34€ on 2334) või BigDecimal klassi arvutusteks. Näide kuidas 2.0 - 1.1 korrektselt ära teha. Pane tähele, et arvud on jutumärkide sees, ilma nendeta tuleksid ikka valed vastused. | ||
<syntaxhighlight lang="Java"> | |||
BigDecimal a = new BigDecimal("2.0"); | BigDecimal a = new BigDecimal("2.0"); | ||
BigDecimal b = new BigDecimal("1.1"); | BigDecimal b = new BigDecimal("1.1"); | ||
BigDecimal c = a.subtract(b); | BigDecimal c = a.subtract(b); | ||
System.out.println("c = " + c); // c = 0.9 | System.out.println("c = " + c); // c = 0.9 | ||
</syntaxhighlight> | |||
== | == String == | ||
String, ehk sõne, objektil on meetode, ehk käsklusi, et lauseid ja sõnu oleks lihtne manipuleerida. | String, ehk sõne, objektil on meetode, ehk käsklusi, et lauseid ja sõnu oleks lihtne manipuleerida. | ||
{| border="1" style="border-collapse:collapse" | |||
! colspan="2" style="font-size: 3em; padding: 0.5em;" | String meetodid | |||
|- | |||
! style="text-align: left; padding: 5px;" | Loo uus sõne | |||
| style="padding: 5px;" | String s = "Tere"; | |||
|- | |||
! style="text-align: left; padding: 5px;" | Leia sõnest kombinatsioon "ere"? | |||
| style="padding: 5px;" | s.contains("ere"); | |||
|- | |||
! style="text-align: left; padding: 5px;" | Muuda kõik tähed suureks | |||
| style="padding: 5px;" | s.toUpperCase(); | |||
|- | |||
! style="text-align: left; padding: 5px;" | Muuda kõik tähed väikseks | |||
| style="padding: 5px;" | s.toLowerCase(); | |||
|- | |||
! style="text-align: left; padding: 5px;" | Poolita sõne tühiku kohalt.<br/>Tulemuseks on sõnede massiiv. | |||
| style="padding: 5px;" | s.split(" "); | |||
|- | |||
! style="text-align: left; padding: 5px;" | Asenda "Tere" sõnega "Nägemist" | |||
| style="padding: 5px;" | s.replace("Tere", "Nägemist"); | |||
|- | |||
! style="text-align: left; padding: 5px;" | Nagu replace(), aga [http://regexone.com/ regex'iga] | |||
| style="padding: 5px;" | s.replaceAll(regex, "uus väärtus"); | |||
|- | |||
! style="text-align: left; padding: 5px;" | Kas sõne on tühi? | |||
| style="padding: 5px;" | s.isEmpty(); | |||
|- | |||
! style="text-align: left; padding: 5px;" | Mis indeksil on sõne "re"? (vastus: 2) | |||
| style="padding: 5px;" | s.indexOf("re"); | |||
|- | |||
! style="text-align: left; padding: 5px;" | Mitu tähte on sõne pikk? | |||
| style="padding: 5px;" | s.length(); | |||
|- | |||
! style="text-align: left; padding: 5px;" | Mis täht asub indeksil 0? | |||
| style="padding: 5px;" | s.charAt(0); | |||
|- | |||
! style="text-align: left; padding: 5px;" | Kas sõne s ja b on identse sisuga? | |||
| style="padding: 5px;" | s.equals(b); | |||
|} | |||
= Kogumik väärtusi = | |||
== | == Sissejuhatus == | ||
Kui andmete kogus suureneb oleks mõistlik saja muutuja asemel kasutada ühte nimekirja. Näiteks kui on spordivõistlused ja võistleja nr 1 tegi 10 katset. Siis 10 muutuja asemel saan öelda: | |||
<syntaxhighlight lang="Java"> | |||
int[] võistleja1 = {76, 56, 75, 45, 56, 76, 65, 67, 45, 54}; | |||
</syntaxhighlight> | |||
== | Kujuta ette, kui võistlejaid on samuti kümme ja igaühel on 10 tulemust. Siis jällegi ei ole meil tarvis kümmet muutujat vaid ühte head HashMapi, mille sees on omakorda ArrayList: | ||
<syntaxhighlight lang="Java"> | |||
HashMap tulemused = new HashMap(); // Loo HashMap | |||
ArrayList voistleja = new ArrayList(); // Loo ArrayList | |||
for (int i = 0; i < 10; i++) { // iga võistleja kohta | |||
voistleja.clear(); // tühjenda eelnevad katsed | |||
for (int j = 0; j < 10; j++) { // iga katse kohta | |||
voistleja.add((int) (Math.random() * 100)); // genereeri katse tulemus ArrayListi sisse | |||
} | |||
tulemused.put("võistleja"+i, voistleja); // lisa ArrayList HashMapi sisse | |||
} | |||
System.out.println("tulemused = " + tulemused); | |||
</syntaxhighlight> | |||
Antud koodi tulemuseks on ilus tabel | |||
=== | tulemused = { | ||
võistleja2 = [54, 17, 25, 16, 10, 98, 86, 92, 10, 54], | |||
võistleja1 = [54, 17, 25, 16, 10, 98, 86, 92, 10, 54], | |||
võistleja0 = [54, 17, 25, 16, 10, 98, 86, 92, 10, 54], | |||
võistleja6 = [54, 17, 25, 16, 10, 98, 86, 92, 10, 54], | |||
võistleja5 = [54, 17, 25, 16, 10, 98, 86, 92, 10, 54], | |||
võistleja4 = [54, 17, 25, 16, 10, 98, 86, 92, 10, 54], | |||
võistleja3 = [54, 17, 25, 16, 10, 98, 86, 92, 10, 54], | |||
võistleja9 = [54, 17, 25, 16, 10, 98, 86, 92, 10, 54], | |||
võistleja8 = [54, 17, 25, 16, 10, 98, 86, 92, 10, 54], | |||
võistleja7 = [54, 17, 25, 16, 10, 98, 86, 92, 10, 54] | |||
} | |||
Kui mul on siis hiljem vaja näiteks võistleja nr 6 tulemust nr 7, siis küsin selle välja ühe reaga: | |||
<syntaxhighlight lang="Java"> | |||
int t = (int) ((ArrayList) tulemused.get("võistleja6")).get(7); | |||
</syntaxhighlight> | |||
See üks rida on muidugi suhteliselt keeruline, aga andmed on meil vähemalt struktureeritud ja korras. | |||
== | == Kolm tüüpi == | ||
Javas on kolm põhilist andmetüüpi andmete salvestamiseks: | |||
'''Massiivid''' | |||
Kõige lihtsamini kasutatav, aga samas kõige paindumatum. Massiivid salvestavad nimekirja ainult ühte andmetüüpi korraga ja nimekirja pikkus ei ole muudetav pärast esmast käivitamist. | |||
'''ArrayList''' | |||
Kasutamine ei ole nii otsekohene, kui massiividega, aga nimekirja pikkus muutub vastavalt sisule ja oskab salvestada erinevaid andmetüüpe ühes nimekirjas. | Kasutamine ei ole nii otsekohene, kui massiividega, aga nimekirja pikkus muutub vastavalt sisule ja oskab salvestada erinevaid andmetüüpe ühes nimekirjas. | ||
'''HashMap''' | |||
Veidi keerulisemat tüüpi nimekiri, aga samas keerulise programmi juures lihtsustab protsesse tohutult! Salvestab <võti: väärtus> tüüpi kirjeid. Näiteks saaks teha sõnaraamatut: "car" -> "auto", "window" -> "aken". | |||
== Head ja halvad omadused võrdluses == | |||
==== | {| border="1" style="border-collapse:collapse" | ||
! style="width: 15%;"| | |||
! style="width: 25%; font-size: 3em; padding: 1em;"|massiiv | |||
! style="width: 25%; font-size: 3em; padding: 1em;"|ArrayList | |||
! style="width: 25%; font-size: 3em; padding: 1em;"|HashMap | |||
|- | |||
! style="font-size: 1.3em; padding: 0.5em;" | kasutamise keerukus | |||
| style="background-color:#B7FFBC;"| lihtne | |||
| style="background-color:#FFFB9A;"| keerukam | |||
| style="background-color:#FFADAD;"| veel keerukam | |||
|- | |||
! style="font-size: 1.3em; padding: 0.5em;" | nimekirja pikkus | |||
| style="background-color:#FFADAD;"| lukus pärast esimest kasutamist | |||
| style="background-color:#B7FFBC;"| muutub vastavalt sisule | |||
| style="background-color:#B7FFBC;"| muutub vastavalt sisule | |||
|- | |||
! style="font-size: 1.3em; padding: 0.5em;" | salvestab andmetüüpe | |||
| style="background-color:#FFADAD;"| lukus ühele tüübile | |||
| style="background-color:#B7FFBC;"| salvestab tüüpe segamini | |||
| style="background-color:#B7FFBC;"| salvestab <tüüp1: tüüp2> väärtusi | |||
|- | |||
! style="font-size: 1.3em; padding: 0.5em;" | <võti: väärtus> tüüpi | |||
| style="background-color:#FFADAD;"| X | |||
| style="background-color:#FFADAD;"| X | |||
| style="background-color:#B7FFBC;"| jah | |||
|- | |||
! style="font-size: 1.3em; padding: 0.5em;" | tulemuse näide | |||
| [54, 65, 23] | |||
| [65, "sõne", "veel sõne"] | |||
| | |||
{<br/> | |||
"Peeter": 35,<br/> | |||
"Mari": 38,<br/> | |||
"Janika": 13,<br/> | |||
"Mikk": 4<br/> | |||
} | |||
|- | |||
! style="font-size: 1.3em; padding: 0.5em;" | maatriksi näide,<br/>ehk kogum kogumi sees | |||
| | |||
[<br/> | |||
[1, 2, 3],<br/> | |||
[4, 5, 6],<br/> | |||
[7, 8, 9]<br/> | |||
]<br/> | |||
| | |||
[<br/> | |||
"sõne",<br/> | |||
["sõne", "massiivi", "sees"],<br/> | |||
"arv on ka",<br/> | |||
456<br/> | |||
] | |||
| | |||
{<br/> | |||
"Milvi": {<br/> | |||
"vanus": 25,<br/> | |||
"elukoht": "Põlva"<br/> | |||
},<br/> | |||
"Laika": {<br/> | |||
"vanus": 66,<br/> | |||
"elukoht": "Kosmos"<br/> | |||
},<br/> | |||
} | |||
|} | |||
== Kuidas koodis kasutada == | |||
a. | {| border="1" style="border-collapse:collapse" | ||
a. | ! style="width: 15%;"| | ||
a. | ! style="width: 25%; font-size: 3em; padding: 1em;"|massiiv | ||
a. | ! style="width: 25%; font-size: 3em; padding: 1em;"|ArrayList | ||
! style="width: 25%; font-size: 3em; padding: 1em;"|HashMap | |||
|- | |||
! style="font-size: 1.3em; padding: 0.5em;" | loo uus tüübita | |||
| style="text-align: center;" | X | |||
| ArrayList a = new ArrayList(); | |||
| HashMap a = new HashMap(); | |||
|- | |||
! style="font-size: 1.3em; padding: 0.5em;" | loo uus tüübiga | |||
| int[] a = new int[pikkus];<br/> | |||
int[] a = {1, 2, 3};<br/> | |||
String[] a = new String[pikkus];<br/> | |||
String[] a = {"kohe", "sõned", "sees"}; | |||
| ArrayList<Integer> a = new ArrayList(); | |||
ArrayList<String> a = new ArrayList(); | |||
| HashMap<String, Integer> a = new HasMap<>(); | |||
|- | |||
! style="font-size: 1.3em; padding: 0.5em;" | küsi kirje väärtus | |||
| a[i] | |||
| a.get(i) | |||
| a.get(võti) | |||
|- | |||
! style="font-size: 1.3em; padding: 0.5em;" | asenda kirje | |||
| a[i] = b | |||
| a.set(i, b) | |||
| a.put(võti, väärtus) | |||
|- | |||
! style="font-size: 1.3em; padding: 0.5em;" | lisa element | |||
| style="text-align: center;" | X | |||
| a.add(väärtus) | |||
| a.put(võti, väärtus) | |||
|- | |||
! style="font-size: 1.3em; padding: 0.5em;" | eemalda element | |||
| style="text-align: center;" | X | |||
| a.remove(väärtus) | |||
| a.remove(võti) | |||
|- | |||
! style="font-size: 1.3em; padding: 0.5em;" | tühjenda | |||
| style="text-align: center;" | X | |||
| a.clear() | |||
| a.clear() | |||
|- | |||
! style="font-size: 1.3em; padding: 0.5em;" | nimekirja pikkus | |||
| a.length | |||
| a.size() | |||
| a.size() | |||
|- | |||
! style="font-size: 1.3em; padding: 0.5em;" | kas sisu on võrdne? | |||
| Arrays.equals(a, b) | |||
| a.equals(b) | |||
| a.equals(b) | |||
|- | |||
! style="font-size: 1.3em; padding: 0.5em;" | kmis indeksil on väärtus? | |||
| style="text-align: center;" | X | |||
| a.indexOf() | |||
| style="text-align: center;" | X | |||
|- | |||
! style="font-size: 1.3em; padding: 0.5em;" | sorteeri tähestiku järg | |||
| Arrays.sort(a) | |||
| Collections.sort(a) | |||
| style="text-align: center;" | X | |||
|- | |||
! style="font-size: 1.3em; padding: 0.5em;" | kas sisaldab? | |||
| style="text-align: center;" | X | |||
| a.contains() | |||
| a.containsKey(); | |||
a.containsValue(); | |||
|- | |||
! style="font-size: 1.3em; padding: 0.5em;" | System.out.println(a) | |||
| Arrays.toString(a) | |||
| a | |||
| a | |||
|- | |||
! style="font-size: 1.3em; padding: 0.5em;" | kas on tühi? | |||
| style="text-align: center;" | X | |||
| a.isEmpty() | |||
| a.isEmpty() | |||
|} |
Latest revision as of 13:50, 16 April 2015
Muutuja on sisuliselt nagu kast, kuhu asju sisse panna. Java nõuab, et sellel kastil oleks nimi ja tüüp. Nimeks pane mida ise soovid, et sa ise ära tunneks ja tüüpidest räägime all pikemalt.
Näiteks kui soovime lapse vanust salvestada, siis sobib selleks int (integer, ehk täisarv) tüüp ja "vanus" nimi:
Seda kirjutaksime Javas järgnevalt:
int vanus = 5;
Kui sooviksin selle lapse nime salvestada, kasutaksin tüüpi String, ehk sõne:
String nimi = "Mikk";
Väikese tähega andmetüübid (int) on primitiivid ja suure tähega (String) on objektid. Vahe on selles, et primitiivne tüüp salvestab lihtsaid andmeid nagu arv või täht, aga objektid salvestavad keerulisemaid andmeid nagu lause. Teine erinevus on see, et objektidel on omad meetodid, mis lihtsustavad toiminguid. Primitiivsetel tüpidel tuleb kasutada abistavaid klasse.
Andmetüüpe on kahte sorti. Ühed salvestavad ühe ainsa väärtuse, teised aga kogumiku väärtusi.
Üksik väärtus
Sissejuhatus
Üldiselt kasutad täisarvude jaoks int
tüüpi muutujaid, komakohaga arvude jaoks double
ja ülejäänud läheb sõne, ehk String
sisse. Kuid võimalusi on veel.
Andmetüüpide võrdlus
hoitav väärtus | näide | kuidas uus luua | liitmine | |
---|---|---|---|---|
byte | väikesed arvud (alates -128 kuni 127) |
25 | byte a = 25; | byte b = (byte) (34 + 3); |
int | täisarvud (alates -2'147'483'648 kuni 2'147'483'647) |
54 | int a = 54; | int a = 34 + 45; |
float | reaalarvud (alates 1.4*10^-45 kuni 3.4*10^38) |
3 | float a = 3; | float a = 34 + 45; |
double | reaalarvud (komakohaga) (alates 4.9*10^-324 kuni 1.79*10^308) |
65.34 | double a = 65.34; | double a = 34 + 45; |
BigDecimal | kõik arvud. BigDecimal on vajalik, et täpseid arvutusi teha. NB! Et arvutused oleksid täpsed, peavad arvud olema jutumärkides, ehk sõne kujul. (arvu suurust limiteerib vaid arvuti mälu) |
BigDecimal("432.76") | BigDecimal a = new BigDecimal("432.76"); |
BigDecimal a = new BigDecimal("2"); BigDecimal b = new BigDecimal("2"); a = a.add(b); // liitmine |
char | üks täht | 't' | char a = 't'; | char a = 't' + 'a'; // a = Õ |
String | Sõne, ehk jutumärkide vahele saab panna kõiki sümboleid | "Tere" | String a = "Tere"; | String a = "Tere, " + "hommikust!"; |
boolean | true või false | true | boolean a = true; | boolean a = true && false; // false boolean a = true || false; // true |
Object | keerulisemad objektid, nagu ArrayList | [34, "ArrayList", 47.5] | ArrayList a = new ArrayList(); | kui objekt toetab siis on tal selleks oma meetod |
Ohukohad
Ettevaatust 1: Arvu miinimum ja maksimum
Igal arvu andmetüübil on oma miinimum ja maksimum võimalik arv, mida andmetüüp suudab hoida. Näiteks kui sul on <byte a = 127>, siis <a + 1> toob tulemuseks -128, sest arv jätkub teisest otsast.
Ettevaatust 2: Arvutused ei ole alati täpsed
Võtame lihtsa tehte: 2.0 - 1.1 = 0.9. Ainult, et tegelikult tuleb Javas vastuseks 0.899999999999999. Kohati uskumatu, et selline viga on sees. Seda esineb ka teistes riistvaralähedastest keeltes.
Lahenduseks on kas kasutada int tüüpi muutujaid (näiteks 23.34€ on 2334) või BigDecimal klassi arvutusteks. Näide kuidas 2.0 - 1.1 korrektselt ära teha. Pane tähele, et arvud on jutumärkide sees, ilma nendeta tuleksid ikka valed vastused.
BigDecimal a = new BigDecimal("2.0");
BigDecimal b = new BigDecimal("1.1");
BigDecimal c = a.subtract(b);
System.out.println("c = " + c); // c = 0.9
String
String, ehk sõne, objektil on meetode, ehk käsklusi, et lauseid ja sõnu oleks lihtne manipuleerida.
String meetodid | |
---|---|
Loo uus sõne | String s = "Tere"; |
Leia sõnest kombinatsioon "ere"? | s.contains("ere"); |
Muuda kõik tähed suureks | s.toUpperCase(); |
Muuda kõik tähed väikseks | s.toLowerCase(); |
Poolita sõne tühiku kohalt. Tulemuseks on sõnede massiiv. |
s.split(" "); |
Asenda "Tere" sõnega "Nägemist" | s.replace("Tere", "Nägemist"); |
Nagu replace(), aga regex'iga | s.replaceAll(regex, "uus väärtus"); |
Kas sõne on tühi? | s.isEmpty(); |
Mis indeksil on sõne "re"? (vastus: 2) | s.indexOf("re"); |
Mitu tähte on sõne pikk? | s.length(); |
Mis täht asub indeksil 0? | s.charAt(0); |
Kas sõne s ja b on identse sisuga? | s.equals(b); |
Kogumik väärtusi
Sissejuhatus
Kui andmete kogus suureneb oleks mõistlik saja muutuja asemel kasutada ühte nimekirja. Näiteks kui on spordivõistlused ja võistleja nr 1 tegi 10 katset. Siis 10 muutuja asemel saan öelda:
int[] võistleja1 = {76, 56, 75, 45, 56, 76, 65, 67, 45, 54};
Kujuta ette, kui võistlejaid on samuti kümme ja igaühel on 10 tulemust. Siis jällegi ei ole meil tarvis kümmet muutujat vaid ühte head HashMapi, mille sees on omakorda ArrayList:
HashMap tulemused = new HashMap(); // Loo HashMap
ArrayList voistleja = new ArrayList(); // Loo ArrayList
for (int i = 0; i < 10; i++) { // iga võistleja kohta
voistleja.clear(); // tühjenda eelnevad katsed
for (int j = 0; j < 10; j++) { // iga katse kohta
voistleja.add((int) (Math.random() * 100)); // genereeri katse tulemus ArrayListi sisse
}
tulemused.put("võistleja"+i, voistleja); // lisa ArrayList HashMapi sisse
}
System.out.println("tulemused = " + tulemused);
Antud koodi tulemuseks on ilus tabel
tulemused = { võistleja2 = [54, 17, 25, 16, 10, 98, 86, 92, 10, 54], võistleja1 = [54, 17, 25, 16, 10, 98, 86, 92, 10, 54], võistleja0 = [54, 17, 25, 16, 10, 98, 86, 92, 10, 54], võistleja6 = [54, 17, 25, 16, 10, 98, 86, 92, 10, 54], võistleja5 = [54, 17, 25, 16, 10, 98, 86, 92, 10, 54], võistleja4 = [54, 17, 25, 16, 10, 98, 86, 92, 10, 54], võistleja3 = [54, 17, 25, 16, 10, 98, 86, 92, 10, 54], võistleja9 = [54, 17, 25, 16, 10, 98, 86, 92, 10, 54], võistleja8 = [54, 17, 25, 16, 10, 98, 86, 92, 10, 54], võistleja7 = [54, 17, 25, 16, 10, 98, 86, 92, 10, 54] }
Kui mul on siis hiljem vaja näiteks võistleja nr 6 tulemust nr 7, siis küsin selle välja ühe reaga:
int t = (int) ((ArrayList) tulemused.get("võistleja6")).get(7);
See üks rida on muidugi suhteliselt keeruline, aga andmed on meil vähemalt struktureeritud ja korras.
Kolm tüüpi
Javas on kolm põhilist andmetüüpi andmete salvestamiseks:
Massiivid
Kõige lihtsamini kasutatav, aga samas kõige paindumatum. Massiivid salvestavad nimekirja ainult ühte andmetüüpi korraga ja nimekirja pikkus ei ole muudetav pärast esmast käivitamist.
ArrayList
Kasutamine ei ole nii otsekohene, kui massiividega, aga nimekirja pikkus muutub vastavalt sisule ja oskab salvestada erinevaid andmetüüpe ühes nimekirjas.
HashMap
Veidi keerulisemat tüüpi nimekiri, aga samas keerulise programmi juures lihtsustab protsesse tohutult! Salvestab <võti: väärtus> tüüpi kirjeid. Näiteks saaks teha sõnaraamatut: "car" -> "auto", "window" -> "aken".
Head ja halvad omadused võrdluses
massiiv | ArrayList | HashMap | |
---|---|---|---|
kasutamise keerukus | lihtne | keerukam | veel keerukam |
nimekirja pikkus | lukus pärast esimest kasutamist | muutub vastavalt sisule | muutub vastavalt sisule |
salvestab andmetüüpe | lukus ühele tüübile | salvestab tüüpe segamini | salvestab <tüüp1: tüüp2> väärtusi |
<võti: väärtus> tüüpi | X | X | jah |
tulemuse näide | [54, 65, 23] | [65, "sõne", "veel sõne"] |
{ |
maatriksi näide, ehk kogum kogumi sees |
[ |
[ |
{ |
Kuidas koodis kasutada
massiiv | ArrayList | HashMap | |
---|---|---|---|
loo uus tüübita | X | ArrayList a = new ArrayList(); | HashMap a = new HashMap(); |
loo uus tüübiga | int[] a = new int[pikkus]; int[] a = {1, 2, 3}; |
ArrayList<Integer> a = new ArrayList();
ArrayList<String> a = new ArrayList(); |
HashMap<String, Integer> a = new HasMap<>(); |
küsi kirje väärtus | a[i] | a.get(i) | a.get(võti) |
asenda kirje | a[i] = b | a.set(i, b) | a.put(võti, väärtus) |
lisa element | X | a.add(väärtus) | a.put(võti, väärtus) |
eemalda element | X | a.remove(väärtus) | a.remove(võti) |
tühjenda | X | a.clear() | a.clear() |
nimekirja pikkus | a.length | a.size() | a.size() |
kas sisu on võrdne? | Arrays.equals(a, b) | a.equals(b) | a.equals(b) |
kmis indeksil on väärtus? | X | a.indexOf() | X |
sorteeri tähestiku järg | Arrays.sort(a) | Collections.sort(a) | X |
kas sisaldab? | X | a.contains() | a.containsKey();
a.containsValue(); |
System.out.println(a) | Arrays.toString(a) | a | a |
kas on tühi? | X | a.isEmpty() | a.isEmpty() |