I200:Muutujad: Difference between revisions

From ICO wiki
Jump to navigationJump to search
No edit summary
Line 87: Line 87:
</syntaxhighlight>
</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:
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">
HashMap tulemused = new HashMap();
HashMap tulemused = new HashMap();                 // Loo HashMap
tulemused.put("võistleja1", new int[]{34, 65, 76, 23, 12, 32, 43, 34, 76, 45});
ArrayList voistleja = new ArrayList();              // Loo ArrayList
tulemused.put("võistleja2", new int[]{54, 65, 4, 34, 45, 57, 45, 34, 43, 54});
for (int i = 0; i < 10; i++) {                      // iga võistleja kohta
tulemused.put("võistleja3", new int[]{76, 65, 45, 65, 76, 4, 45, 65, 76, 8});
    voistleja.clear();                              // tühjenda eelnevad katsed
tulemused.put("võistleja4", new int[]{34, 45, 65, 76, 87, 45, 45, 56, 76, 87});
    for (int j = 0; j < 10; j++) {                  // iga katse kohta
tulemused.put("võistleja5", new int[]{23, 34, 54, 65, 76, 4, 5, 6, 76, 87});
        voistleja.add((int) (Math.random() * 100)); // genereeri katse tulemus
tulemused.put("võistleja1", new int[]{32, 43, 34, 76, 45, 34, 65, 76, 23, 12});
    }
tulemused.put("võistleja2", new int[]{57, 45, 34, 43, 54, 54, 65, 4, 34, 45});
    tulemused.put("võistleja"+i, voistleja);        // lisa ArrayList HashMapi sisse
tulemused.put("võistleja3", new int[]{ 4, 45, 65, 76, 8, 76, 65, 45, 65, 76});
}
tulemused.put("võistleja4", new int[]{45, 45, 56, 76, 87, 34, 45, 65, 76, 87});
System.out.println("tulemused = " + tulemused);
tulemused.put("võistleja5", new int[]{ 4,  5,  6, 76, 87, 23, 34, 54, 65, 76});
</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 kahe reaga:
<syntaxhighlight lang="Java">
int[] t = (int[]) tulemused.get("võistleja6");
System.out.println("tulemus6-7 = " + t[7]);
</syntaxhighlight>
</syntaxhighlight>



Revision as of 15:25, 15 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

Arvud

  • byte - pisikesed arvud (-128 kuni 127)
  • 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

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

Tekst

  • 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 s = "Tere"; // Loome uue sõne

s.contains("ere"); // Kas sõnes s esineb tähekombinatsiooni "ere"?
s.toUpperCase(); // Muuda kõik tähed suureks
s.toLowerCase(); // Muuda kõik tähed väikseks
s.split(" "); // Poolita sõne tühiku kohalt. Tulemuseks on sõnede massiiv.
s.replace("Tere", "Nägemist"); // Otsi sõna "Tere" ja asenda see sõnega "Nägemist"
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?
s.indexOf("re"); // Mis indeksil on sõne "re"? Antud juhul tuleb vastuseks 2
s.length(); // Mitu tähte on sõne pikk?
s.charAt(0); // Mis täht asub indeksil 0?
s.equals(b); // Kas sõne s on sama sisuga mis sõne b?

Muu

  • boolean - true või false, seda kasutatakse loogikas kus on vaja salvestada "tõene" ja "väär" väärtusi.
    • boolean a = true;

Kogumik väärtusi

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
    }
    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 kahe reaga:

int[] t = (int[]) tulemused.get("võistleja6");
System.out.println("tulemus6-7 = " + t[7]);

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