I200:Muutujad: Difference between revisions

From ICO wiki
Jump to navigationJump to search
No edit summary
Line 32: Line 32:
* BigDecimal - kõige täpsem viis numbreid arvutada.
* BigDecimal - kõige täpsem viis numbreid arvutada.


=== Probleeme ===
=== 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.
=== Arvutuste ebatäpsus ===


Teine probleem, mis võib esineda, on arvutuste ebatäpsus. Proovi näiteks tehet <double d = 2.0 - 1.1;>. See on kohati uskumatu, aga see viga esineb ka teistel riistvara lähedastel keeltel. Lahenduseks on kas kasutada int tüüpi muutujaid (näiteks 23.34€ on 2334) või BigDecimal klassi arvutusteks.
Teine probleem, mis võib esineda, on arvutuste ebatäpsus. Proovi näiteks tehet <double d = 2.0 - 1.1;>. See on kohati uskumatu, aga see viga esineb ka teistel riistvara lähedastel keeltel. Lahenduseks on kas kasutada int tüüpi muutujaid (näiteks 23.34€ on 2334) või BigDecimal klassi arvutusteks.
==== BigDecimal ====


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.
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.
Line 54: Line 54:
* String - sõnad ja laused salvestatakse eesti keeles "sõne" andmetüüpi (tähistamiseks topelt jutumärgid, näiteks "Tere")
* String - sõnad ja laused salvestatakse eesti keeles "sõne" andmetüüpi (tähistamiseks topelt jutumärgid, näiteks "Tere")


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

Revision as of 16:40, 14 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 ä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.

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.

Arvutuste ebatäpsus

Teine probleem, mis võib esineda, on arvutuste ebatäpsus. Proovi näiteks tehet <double d = 2.0 - 1.1;>. See on kohati uskumatu, aga see viga esineb ka teistel riistvara lähedastel keeltel. 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

Sõnad

  • 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.

Oletame, et meil on sõne <String s = "Tere">

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.

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

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
- nimekirja pikkus jääb lukku
- saad maksimaalselt üte andmetüüpi sisse salvestada
- printimiseks vaja Arrays klassi

Loo uus

int[] a = new int[p]; // loo tühi massiiv, kus p on nimekirja pikkus numbriga (näiteks 6)
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

toimingud

a[0]; // mis väärtus on esimesel positioonil?
a[0] = 5; // asenda esimesel positioonil olev väärtus uuega
a.length; // kui pikk on nimekiri?
Arrays.sort(a); // sorteeri tähestikulises järjekorras
Arrays.equals(a, b); // kas massiiv a sisu on sama mis massiiv b sisu?
System.out.println(   Arrays.toString(a) ); // prindi väärtused inimkeeli

ArrayList

Kasutamine ei ole nii otsekohene, kui massiividega, aga nimekirja pikkus muutub vastavalt sisule ja oskab salvestada erinevaid andmetüüpe ühes nimekirjas.

omadused

- keeruline kasutada
- uut nimekirja luues ei saa koheselt väärtusi sisestada
++ nimekirja pikkus muutub vastavalt sisule
+ salvestab kõiki andmetüüpe
+ printimine lihtne

Tuleb importida

Loo uus

ArrayList a = new ArrayList(); // loo tühi ArrayList
ArrayList<Integer> a = new ArrayList<Integer>(); // mahuvad sisse ainult täisarvud
ArrayList<String> a = new ArrayList<String>(); // mahuvad sisse ainult sõned

toimingud

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"?

HashMap

Veidi keerulisemat tüüpi nimekiri, aga samas keerulise programmi juures lihtsustab protsesse!

Salvestab <võti: väärtus> tüüpi kirjeid. Näiteks saad teha tabeli "Taavi": 25, "Johanna": 23, "Mari": 55, "Toomas": 65,

Väärtuseks võid kasutada ka näiteks ArrayListe, saaksid tulemuseks "Taavi": [25, "Tallinn", "mees"], "Johanna": [23, "Viljandi", "naine"], "Mari": [55, "Tartu", "naine"], "Toomas": [65, "Tallinn", "mees"],

omadused

-- veel keerulisem kasutada
- uut nimekirja luues ei saa koheselt väärtusi sisestada
++ toetab võti->väärtus kirjeid.
+ salvestab kõiki andmetüüpe
+ nimekirja pikkus muutub vastavalt sisule
+ printimine on lihtne

  • Tuleb importida

Loo uus

HashMap a = new HashMap(); // loo tühi HashMap
HashMap<String, Integer> a = new HashMap<>(); // <sõne: täisarv> kombinatsiooni salvestamiseks (näiteks <"Taavi": 25>)

toimingud

a.get("võti"); // mis on "võti" väärtus?
a.put("võti", 8372); // lisa uus võti nimega "võti" väärtusega 8372 (kirjuta üle, kui on juba olemas)
a.remove("võti"); // eemalda võti:väärtus nimekirjast
a.clear(); // Tühjenda nimekiri
a.size(); // Mis on nimekirja pikkus?
a.equals(b); // Kas HashMap a sisu on identne HashMap b sisuga?
System.out.println( a ); // prindi väärtused inimkeeli

a.containsKey("võti"); // Kas nimekiri sisaldab võtit "võti"?
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