MOOC-2019 / Peruskomentoja

Kurssin sisällysluettelo

Ohjelmarunko

public class Esimerkki {
    public static void main(String[] args) {
        // Tänne kirjoitetaan ohjelman käyttämät lauseet

    }
}

Tulostus ja lukeminen

import java.util.Scanner;

public class Ohjelma {

    public static void main(String[] args) {
        Scanner lukija = new Scanner(System.in);

        String viesti = lukija.nextLine();
        System.out.println(viesti);
        omaMetodi(viesti);
        System.out.println(palautaNumero());
    }

    public static void omaMetodi(String tamaOnViesti) {
        //Tänne voit tehdä omia metodeja
        System.out.println(tamaOnViesti);
    }

    public static int palautaNumero() {
        return 2;
    }
}

Muuttujat

String teksti = "sisältää tekstiä";
int kokonaisluku = 123;
int luku = Integer.valueOf(lukuMerkkijonona);
double liukuluku = 3.141592653;
double luku = Double.valueOf(lukuMerkkijonona);
boolean totuusarvo = true;

Vertailu ja toisto

if (eka.equals(toka)) {
    System.out.println("Merkkijonot olivat samat!");
} else {
    System.out.println("Merkkijonot olivat eri!");
}
while (true) {
    if (luettujaLukuja == 10) {
        break; --> KESKEYTTÄÄ TOISTOLAUSEEN
    }
    if (luku <= 0) {
        System.out.println("Epäkelpo luku! Yritä uudelleen.");
        continue; --> PALAA TOISTOLAUSEEN ALKUUN
    }
}

Listat

ArrayList<String> lista = new ArrayList<>();
lista.add("eka");
lista.get(0);
lista.remove(1);

lista.size();

for (String arvo: lista) {
    System.out.println(arvo);
}

boolean loytyiko = lista.contains("Toka");

public static int koko(ArrayList<String> lista) {
    return lista.size();
}

Merkkijonot

String sana = "merkkijono";

int indeksi = sana.indexOf("erkki"); //indeksin arvoksi tulee 1
System.out.println(sana.substring(indeksi)); //tulostetaan "erkkijono"

indeksi = sana.indexOf("jono"); //indeksin arvoksi tulee 6
System.out.println(sana.substring(indeksi)); //tulostetaan "jono"

indeksi = sana.indexOf("kirja"); //sana "kirja" ei sisälly sanaan "merkkijono"
System.out.println(indeksi); // tulostetaan -1
System.out.println(sana.substring(indeksi)); // virhe!
indeksi = sana.indexOf("erkki", 2); // indeksin arvoksi tulee -1 sillä erkkiä ei löydy lopusta
System.out.println(sana.substring(indeksi)); // tapahtuu virhe!

String merkkijono = "eka toka kolmas neljäs";
String[] palat = merkkijono.split("\\s+");
System.out.println(palat[0]);
System.out.println(palat[1]);
System.out.println(palat[2]);
System.out.println(palat[3]);

Tiedostosta lukeminen

// alkuun
import java.util.Scanner;
import java.io.File;

// ohjelmassa:
// luodaan lukija tiedoston lukemista varten
try (Scanner tiedostonLukija = new Scanner(new File("tiedosto.txt"))) {

    // luetaan tiedostoja kunnes kaikki rivit on luettu
    while (tiedostonLukija.hasNextLine()) {
        // luetaan yksi rivi
        String rivi = tiedostonLukija.nextLine();
        // tulostetaan luettu rivi
        System.out.println(rivi);
    }
} catch (Exception e) {
    System.out.println("Virhe: " + e.getMessage());
}

//ArrayListiin:

ArrayList<String> rivit = new ArrayList<>();

// luodaan lukija tiedoston lukemista varten
try (Scanner tiedostonLukija = new Scanner(new File("tiedosto.txt"))) {

    // luetaan kaikki tiedoston rivit
    while (tiedostonLukija.hasNextLine()) {

        String rivi = tiedostonLukija.nextLine();

        // mikäli rivi on tyhjä, ei käsitellä sitä
        if (rivi.trim().length() == 0) {
            continue;
        }
        rivit.add(tiedostonLukija.nextLine());
    }
} catch (Exception e) {
    System.out.println("Virhe: " + e.getMessage());
}

Tiedostoon tallentaminen

public class Tallentaja {

    public void kirjoitaTiedostoon(String tiedostonNimi, String teksti) throws Exception {
        PrintWriter kirjoittaja = new PrintWriter(tiedostonNimi);
        kirjoittaja.println(teksti);
        kirjoittaja.close();
    }
}

Satunnaisluku

Random arpoja = new Random(); // luodaan apuväline arpoja
int luku = arpoja.nextInt(10); --> Arpoo luvun 0-9 väliltä
int lampotila = arpoja.nextInt(81) - 30; --> Arpoo luvun -30 - 50 väliltä

Poikkeusten käsittely

try {
    // poikkeuksen mahdollisesti heittävä ohjelmakoodi
} catch (Exception e) {
    // lohko johon päädytään poikkeustilanteessa
}

HEITTÄMINEN:

public List<String> lue(String tiedosto) throws Exception {
    ArrayList<String> rivit = new ArrayList<>();
    Files.lines(Paths.get(tiedosto)).forEach(rivi -> rivit.add(rivi));
    return rivit;
}

Listan käsittely virtana

long kolmellaJaollistenLukumaara = syotteet.stream()
    .mapToInt(s -> Integer.valueOf(s))
    .filter(luku -> luku % 3 == 0)
    .count(); --> Arvojen lukumäärä
double keskiarvo = syotteet.stream()
    .mapToInt(s -> Integer.valueOf(s))
    .average()
    .getAsDouble(); --> Arvojen keskiarvo
luvut.stream()
    .filter(luku -> luku % 2 == 0)
    .forEach(luku -> System.out.println(luku)); --> Tulosta kelvot luvut
ArrayList<Integer> positiiviset = luvut.stream()
    .filter(luku -> luku > 0)
    .collect(Collectors.toCollection(ArrayList::new)); --> Kokoa uuteen listaan
int summa = luvut.stream()
    .reduce(0, (edellinenSumma, luku) -> edellinenSumma + luku); --> Summan laskeminen
// oletetaan, että käytössämme on lista henkiloita
// ArrayList<Henkilo> henkilot = new ArrayList<>();
long lkm = henkilot.stream()
    .filter(henkilo -> henkilo.getSyntymavuosi() < 1970)
    .count(); --> Henkilöiden lukumäärä, jotka syntyneet ennen 1970
long lkm = henkilot.stream()
    .filter(henkilo -> henkilo.getEtunimi().startsWith("A"))
    .count(); --> A:lla alkavien henkilöiden lkm
henkilot.stream()
    .map(henkilo -> henkilo.getEtunimi())
    .distinct()
    .sorted()
    .forEach(nimi -> System.out.println(nimi)); --> Uniikit etunimet aakkosjärjestyksessä
kirjat.stream()
    .map(kirja -> kirja.getKirjailija().getNimi() + ": " + kirja.getNimi())
    .sorted()
    .forEach(nimi -> System.out.println(nimi)); --> Olion kahden tiedon yhdistely ja järjestäminen
// Kaarlo Juho Ståhlberg; 1865
List<Henkilo> presidentit = new ArrayList<>();
try {
    // luetaan tiedosto "presidentit.txt" riveittäin
    Files.lines(Paths.get("presidentit.txt"))
        // pilkotaan rivi osiin ";"-merkin kohdalta
        .map(rivi -> rivi.split(";"))
        // poistetaan ne pilkotut rivit, joissa alle 2 osaa
        // (haluamme että rivillä on aina nimi ja syntymävuosi)
        .filter(palat -> palat.length >= 2)
        // luodaan palojen perusteella henkilöitä
        .map(palat -> new Henkilo(palat[0], Integer.valueOf(palat[1])))
        // ja lisätään henkilöt lopulta listalle
        .forEach(henkilo -> presidentit.add(henkilo));
} catch (Exception e) {
    System.out.println("Virhe: " + e.getMessage());
} --> Tiedoston tietojen lukeminen olioon

Comparable-rajapinta

public class Kerholainen implements Comparable<Kerholainen> {
    private String nimi;
    private int pituus;

    public Kerholainen(String nimi, int pituus) {
        this.nimi = nimi;
        this.pituus = pituus;
    }

    public String getNimi() {
        return this.nimi;
    }

    public int getPituus() {
        return this.pituus;
    }

    @Override
    public String toString() {
        return this.getNimi() + " (" + this.getPituus() + ")";
    }

    @Override
    public int compareTo(Kerholainen kerholainen) {
        if (this.pituus == kerholainen.getPituus()) {
            return 0;
        } else if (this.pituus > kerholainen.getPituus()) {
            return 1;
        } else {
            return -1;
        }
    }

TAI
    return this.pituus - kerholainen.getPituus();
}

--> Comparable-rajapinnan vaatima compareTo-metodi saa parametrinaan olion, johon "this"-oliota verrataan. Mikäli olio on vertailujärjestyksessä ennen parametrina saatavaa olioa, tulee metodin palauttaa negatiivinen luku. Mikäli taas olio on järjestyksessä parametrina saatavan olion jälkeen, tulee metodin palauttaa positiivinen luku. Muulloin palautetaan luku 0. 

// tulostettavan virran järjestäminen virran sorted-metodilla
kerholaiset.stream().sorted().forEach(k -> System.out.println(k);
// listan järjestäminen Collections-luokan tarjoamalla sort-metodilla
Collections.sort(kerholaiset);
kerholaiset.stream().forEach(k -> System.out.println(k);

JÄRJESTÄMINEN ILMAN COMPARABLE-RAJAPINNAN TOTEUTTAMISTA

henkilot.stream().sorted((h1, h2) -> {
    return h1.getSyntymavuosi() - h2.getSyntymavuosi();
}).forEach(h -> System.out.println(h.getNimi()));

TAI

Collections.sort(henkilot, (h1, h2) -> return h1.getSyntymavuosi() - h2.getSyntymavuosi());
henkilot.stream().forEach(h -> System.out.println(h.getNimi()));

JÄRJESTÄMINEN USEAMMAN METODIN AVULLA

List<Elokuva> elokuvat = new ArrayList<>();
Comparator<Elokuva> vertailija = Comparator
              .comparing(Elokuva::getJulkaisuvuosi)
              .thenComparing(Elokuva::getNimi);
Collections.sort(elokuvat, vertailija);
for (Elokuva e: elokuvat) {
    System.out.println(e);
}