I200:Muutujad: Difference between revisions

From ICO wiki
Jump to navigationJump to search
Kviirsaa (talk | contribs)
No edit summary
Kviirsaa (talk | contribs)
 
(27 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 sellel kastil oleks nimi ja tüüp. Nimeks pane mida ise soovid, et sa ise ära tunneks ja tüüpidest räägime all pikemalt.
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:
Näiteks kui soovime lapse vanust salvestada, siis sobib selleks int (integer, ehk täisarv) tüüp ja "vanus" nimi:


[[File:Muutuja.png]]
[[File:Muutuja.png|200px]]


Seda kirjutaksime Javas järgnevalt:
Seda kirjutaksime Javas järgnevalt:
Line 25: Line 27:
= Üksik väärtus =
= Üksik väärtus =


== Arvud ==
== 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
|}


* byte - pisikesed arvud (-128 kuni 127)
== Ohukohad ==
* int - täisarvud (alates -2*10^9 kuni 2*10^9)
* double - reaalarvud (komakohaga) (alates -9*10^18 kuni 9*10^18)
* BigDecimal - kõige täpsem viis numbreid arvutada.


==== Ettevaatust 1: Arvu miinimum ja maksimum ====
==== Ettevaatust 1: Arvu miinimum ja maksimum ====
Line 49: Line 118:
</syntaxhighlight>
</syntaxhighlight>


== Tekst ==
== String ==
 
* char - üks täht (tähistamiseks kasutatakse üksikuid jutumärke, näiteks 'k')
* String - sõnad ja laused salvestatakse eesti keeles "sõne" andmetüüpi (tähistamiseks topelt jutumärgid, näiteks "Tere")
 
==== 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.


<syntaxhighlight lang="Java">
{| border="1" style="border-collapse:collapse"
String s = "Tere"; // Loome uue sõne
! colspan="2" style="font-size: 3em; padding: 0.5em;"  | String meetodid
 
|-
s.contains("ere"); // Kas sõnes s esineb tähekombinatsiooni "ere"?
! style="text-align: left; padding: 5px;" | Loo uus sõne
s.toUpperCase(); // Muuda kõik tähed suureks
| style="padding: 5px;" | String s = "Tere";
s.toLowerCase(); // Muuda kõik tähed väikseks
|-
s.split(" "); // Poolita sõne tühiku kohalt. Tulemuseks on sõnede massiiv.
! style="text-align: left; padding: 5px;" | Leia sõnest kombinatsioon "ere"?
s.replace("Tere", "Nägemist"); // Otsi sõna "Tere" ja asenda see sõnega "Nägemist"
| style="padding: 5px;" | s.contains("ere");
s.replaceAll(regex, "uus väärtus"); // Kasulik <replace()> sarnane töövahend, aga esmalt uuri välja misasi on regex.
|-
s.isEmpty(); // Kas sõne on tühi?
! style="text-align: left; padding: 5px;" | Muuda kõik tähed suureks
s.indexOf("re"); // Mis indeksil on sõne "re"? Antud juhul tuleb vastuseks 2
| style="padding: 5px;" | s.toUpperCase();
s.length(); // Mitu tähte on sõne pikk?
|-
s.charAt(0); // Mis täht asub indeksil 0?
! style="text-align: left; padding: 5px;" | Muuda kõik tähed väikseks
s.equals(b); // Kas sõne s on sama sisuga mis sõne b?
| style="padding: 5px;" | s.toLowerCase();
</syntaxhighlight>
|-
 
! style="text-align: left; padding: 5px;" | Poolita sõne tühiku kohalt.<br/>Tulemuseks on sõnede massiiv.
== Muu ==
| style="padding: 5px;" | s.split(" ");
 
|-
* boolean - true või false, seda kasutatakse loogikas kus on vaja salvestada "tõene" ja "väär" väärtusi.
! style="text-align: left; padding: 5px;" | Asenda "Tere" sõnega "Nägemist"
** <code>boolean a = true;</code>
| 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 =
= Kogumik väärtusi =


Kui andmete kogus suureneb oleks mõistlik saja muutuja asemel kasutada ühte nimekirja. Javas on kolm põhilist, mida kasutada. Massiivid ja ArrayListid salvestavad järjekorra numbri alusel kirjeid. Veidi harjumatu on, et loend algab nullist, ehk esimene kirje on 0, teine on 1, kolmas on 2, jne. HashMap ei kasuta mitte numbreid vaid mida sina soovid. Näiteks saab seal teha sõnapaare "car"->"auto".
== Sissejuhatus ==
 
== 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.
 
=== omadused ===
 
++ lihtne kasutada<br />
- nimekirja pikkus jääb lukku<br />
- saad maksimaalselt üte andmetüüpi sisse salvestada<br />
- printimiseks vaja Arrays klassi<br />
 
=== Loo uus ===


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">
<syntaxhighlight lang="Java">
int[] a = new int[p]; // loo tühi massiiv, kus p on nimekirja pikkus numbriga (näiteks 6)
int[] võistleja1 = {76, 56, 75, 45, 56, 76, 65, 67, 45, 54};
int[] a = {1, 4, 5}; // lisame koheselt numbrid 1, 4 ja 5. Nimekirja pikkuseks sai 3.
String[] a = new String[p];
String[] a = {"mitu", "sõne", "korraga"};
int[][] maatriks = new int[3][4]; // maatriks tuleb suuruses 3x4
</syntaxhighlight>
</syntaxhighlight>


=== toimingud ===
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">
<syntaxhighlight lang="Java">
a[0]; // mis väärtus on esimesel positioonil?
HashMap tulemused = new HashMap();                  // Loo HashMap
a[0] = 5; // asenda esimesel positioonil olev väärtus uuega
ArrayList voistleja = new ArrayList();             // Loo ArrayList
a.length; // kui pikk on nimekiri?
for (int i = 0; i < 10; i++) {                      // iga võistleja kohta
Arrays.sort(a); // sorteeri tähestikulises järjekorras
    voistleja.clear();                              // tühjenda eelnevad katsed
Arrays.equals(a, b); // kas massiiv a sisu on sama mis massiiv b sisu?
    for (int j = 0; j < 10; j++) {                  // iga katse kohta
System.out.println(   Arrays.toString(a) ); // prindi väärtused inimkeeli
        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>
</syntaxhighlight>


== ArrayList ==
Antud koodi tulemuseks on ilus tabel
 
Kasutamine ei ole nii otsekohene, kui massiividega, aga nimekirja pikkus muutub vastavalt sisule ja oskab salvestada erinevaid andmetüüpe ühes nimekirjas.
 
=== omadused ===
 
- keeruline kasutada<br />
- uut nimekirja luues ei saa koheselt väärtusi sisestada<br />
++ nimekirja pikkus muutub vastavalt sisule<br />
+ salvestab kõiki andmetüüpe<br />
+ printimine lihtne<br />
 
Tuleb importida


=== Loo uus ===
    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">
<syntaxhighlight lang="Java">
ArrayList a = new ArrayList(); // loo tühi ArrayList
int t = (int) ((ArrayList) tulemused.get("võistleja6")).get(7);
ArrayList<Integer> a = new ArrayList<Integer>(); // mahuvad sisse ainult täisarvud
ArrayList<String> a = new ArrayList<String>(); // mahuvad sisse ainult sõned
</syntaxhighlight>
</syntaxhighlight>
See üks rida on muidugi suhteliselt keeruline, aga andmed on meil vähemalt struktureeritud ja korras.


=== toimingud ===
== Kolm tüüpi ==


<syntaxhighlight lang="Java">
Javas on kolm põhilist andmetüüpi andmete salvestamiseks:
a.get(0); // mis on esimesel positsioonil olev väärtus?
a.set(0, "uus väärtus"); // asenda esimesel positsioonil olev väärtus
a.add(4); // lisa nimekirja lõppu uus väärtus 4
a.remove(0); // eemalda väärtus positsioonilt 0
a.clear(); // tühjenda nimekiri
a.size(); // Mis on nimekirja pikkus?
a.isEmpty(); // Kas nimekiri on tühi?
a.equals(b); // Kas ArrayList a sisu on identne ArrayList b sisuga?
a.indexOf("väärtus"); // mis indeksiga on väärtus "väärtus"?
a.lastIndexOf("väärtus"); // Mis indeksil on viimane väärtuse esinemine?
Collections.sort(a); // sorteeri väärtused tähestikulises järjekorras
System.out.println( a ); // prindi väärtused inimkeeli


a.contains("väärtus"); // Kas nimekirjas on väärtus "väärtus"?
'''Massiivid'''
</syntaxhighlight>


== HashMap ==
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.


Veidi keerulisemat tüüpi nimekiri, aga samas keerulise programmi juures lihtsustab protsesse! Salvestab <võti: väärtus> tüüpi kirjeid.
'''ArrayList'''


Näiteks <code>HasMap<String, Integer></code> võimaldab teha tabeli:<br />
Kasutamine ei ole nii otsekohene, kui massiividega, aga nimekirja pikkus muutub vastavalt sisule ja oskab salvestada erinevaid andmetüüpe ühes nimekirjas.
"Taavi": 25,<br />
"Johanna": 23,<br />
"Mari": 55,<br />
"Toomas": 65,<br />


Veel huvitavam on väärtuseks panna ArrayList, ehk <code>HashMap<String, ArrayList></code> võimaldab salvestada selliseid tabeleid:<br/>
'''HashMap'''
"Taavi": [25, "Tallinn", "mees"],<br />
"Johanna": [23, "Viljandi", "naine"],<br />
"Mari": [55, "Tartu", "naine"],<br />
"Toomas": [65, "Tallinn", "mees"],<br />


=== omadused ===
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".


-- veel keerulisem kasutada<br />
== Head ja halvad omadused võrdluses ==
- uut nimekirja luues ei saa koheselt väärtusi sisestada<br />
++ toetab võti->väärtus kirjeid.<br />
+ salvestab kõiki andmetüüpe<br />
+ nimekirja pikkus muutub vastavalt sisule<br />
+ printimine on lihtne<br />


* Tuleb importida
{| border="1" style="border-collapse:collapse"
 
! style="width: 15%;"|
=== Loo uus ===
! style="width: 25%; font-size: 3em; padding: 1em;"|massiiv
 
! style="width: 25%; font-size: 3em; padding: 1em;"|ArrayList
<syntaxhighlight lang="Java">
! style="width: 25%; font-size: 3em; padding: 1em;"|HashMap
HashMap a = new HashMap(); // loo tühi HashMap
|-
HashMap<String, Integer> a = new HashMap<>(); // <sõne: täisarv> kombinatsiooni salvestamiseks (näiteks <"Taavi": 25>)
! style="font-size: 1.3em; padding: 0.5em;" | kasutamise keerukus
</syntaxhighlight>
| style="background-color:#B7FFBC;"| lihtne
 
| style="background-color:#FFFB9A;"| keerukam
=== toimingud ===
| style="background-color:#FFADAD;"| veel keerukam
 
|-
<syntaxhighlight lang="Java">
! style="font-size: 1.3em; padding: 0.5em;" | nimekirja pikkus
a.get("võti"); // mis on "võti" väärtus?
| style="background-color:#FFADAD;"| lukus pärast esimest kasutamist
a.put("võti", 8372); // lisa uus võti nimega "võti" väärtusega 8372 (kirjuta üle, kui on juba olemas)
| style="background-color:#B7FFBC;"| muutub vastavalt sisule
a.remove("võti"); // eemalda võti:väärtus nimekirjast
| style="background-color:#B7FFBC;"| muutub vastavalt sisule
a.clear(); // Tühjenda nimekiri
|-
a.size(); // Mis on nimekirja pikkus?
! style="font-size: 1.3em; padding: 0.5em;" | salvestab andmetüüpe
a.equals(b); // Kas HashMap a sisu on identne HashMap b sisuga?
| style="background-color:#FFADAD;"| lukus ühele tüübile
System.out.println( a ); // prindi väärtused inimkeeli
| 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/>
    }
|}


a.containsKey("võti"); // Kas nimekiri sisaldab võtit "võti"?
== Kuidas koodis kasutada ==
a.containsKey("väärtus"); // Kas nimekiri sisaldab väärtust "väärtus"?
a.isEmpty(); // Kas nimekiri on tühi?
a.keySet(); // väljasta võtmete nimekiri ilma väärtusteta
</syntaxhighlight>


{| class="wikitable"
{| border="1" style="border-collapse:collapse"
!  
! style="width: 15%;"|
! massiiv
! style="width: 25%; font-size: 3em; padding: 1em;"|massiiv
! ArrayList
! style="width: 25%; font-size: 3em; padding: 1em;"|ArrayList
! HashMap
! style="width: 25%; font-size: 3em; padding: 1em;"|HashMap
|-
|-
| loo uus tüübita
! style="font-size: 1.3em; padding: 0.5em;" | loo uus tüübita
| X
| style="text-align: center;" | X
| ArrayList a = new ArrayList();
| ArrayList a = new ArrayList();
| HashMap a = new HashMap();
| HashMap a = new HashMap();
|-
|-
| loo uus tüübiga
! style="font-size: 1.3em; padding: 0.5em;" | loo uus tüübiga
| int[] a = new int[pikkus];
| int[] a = new int[pikkus];<br/>
int[] a = {1, 2, 3};
int[] a = {1, 2, 3};<br/>
String[] a = new String[pikkus];
String[] a = new String[pikkus];<br/>
String[] a = {"kohe", "sõned", "sees"};
String[] a = {"kohe", "sõned", "sees"};
| ArrayList<Integer> a = new ArrayList();
| ArrayList<Integer> a = new ArrayList();
Line 227: Line 310:
| HashMap<String, Integer> a = new HasMap<>();
| HashMap<String, Integer> a = new HasMap<>();
|-
|-
| küsi kirje väärtus
! style="font-size: 1.3em; padding: 0.5em;" | küsi kirje väärtus
| a[i]
| a[i]
| a.get(i)
| a.get(i)
| a.get(võti)
| a.get(võti)
|-
|-
| asenda kirje
! style="font-size: 1.3em; padding: 0.5em;" | asenda kirje
| a[i] = b
| a[i] = b
| a.set(i, b)
| a.set(i, b)
| a.put(võti, väärtus)
| a.put(võti, väärtus)
|-
|-
| lisa element
! style="font-size: 1.3em; padding: 0.5em;" | lisa element
| X
| style="text-align: center;" | X
| a.add(väärtus)
| a.add(väärtus)
| a.put(võti, väärtus)
| a.put(võti, väärtus)
|-
|-
| eemalda element
! style="font-size: 1.3em; padding: 0.5em;" | eemalda element
| X
| style="text-align: center;" | X
| a.remove(väärtus)
| a.remove(väärtus)
| a.remove(võti)
| a.remove(võti)
|-
|-
| tühjenda
! style="font-size: 1.3em; padding: 0.5em;" | tühjenda
| X
| style="text-align: center;" | X
| a.clear()
| a.clear()
| a.clear()
| a.clear()
|-
|-
| nimekirja pikkus
! style="font-size: 1.3em; padding: 0.5em;" | nimekirja pikkus
| a.length
| a.length
| a.size()
| a.size()
| a.size()
| a.size()
|-
|-
| kas sisu on võrdne?
! style="font-size: 1.3em; padding: 0.5em;" | kas sisu on võrdne?
| Arrays.equals(a, b)
| Arrays.equals(a, b)
| a.equals(b)
| a.equals(b)
| a.equals(b)
| a.equals(b)
|-
|-
| kmis indeksil on väärtus?
! style="font-size: 1.3em; padding: 0.5em;" | kmis indeksil on väärtus?
| X
| style="text-align: center;" | X
| a.indexOf()
| a.indexOf()
| X
| style="text-align: center;" | X
|-
|-
| sorteeri tähestiku järg
! style="font-size: 1.3em; padding: 0.5em;" | sorteeri tähestiku järg
| Arrays.sort(a)
| Arrays.sort(a)
| Collections.sort(a)
| Collections.sort(a)
| X
| style="text-align: center;" | X
|-
|-
| kas sisaldab?
! style="font-size: 1.3em; padding: 0.5em;" | kas sisaldab?
| X
| style="text-align: center;" | X
| a.contains()
| a.contains()
| a.containsKey();
| a.containsKey();
a.containsValue();
a.containsValue();
|-
|-
| System.out.println(a)
! style="font-size: 1.3em; padding: 0.5em;" | System.out.println(a)
| Arrays.toString(a)
| Arrays.toString(a)
| a
| a
| a
| a
|-
|-
| kas on tühi?
! style="font-size: 1.3em; padding: 0.5em;" | kas on tühi?
| X
| style="text-align: center;" | X
| a.isEmpty()
| a.isEmpty()
| 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"]
   {
"Peeter": 35,
"Mari": 38,
"Janika": 13,
"Mikk": 4
}
maatriksi näide,
ehk kogum kogumi sees
   [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
   [
"sõne",
["sõne", "massiivi", "sees"],
"arv on ka",
456
]
   {
"Milvi": {
"vanus": 25,
"elukoht": "Põlva"
},
"Laika": {
"vanus": 66,
"elukoht": "Kosmos"
},
}

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};
String[] a = new String[pikkus];
String[] a = {"kohe", "sõned", "sees"};

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()