Gyakorlati alapok III.

Collection példakód - Lajhárpárok és utódaik


Ez a fejezet egy tipikusnak mondható Java-környezetet modellez, amely manapság széleskörben megtalálható a banki szektorban, valamint kommunikációs szolgáltató cégeknél (mobil, tartalomszolgáltatás, stb.). A komplex példa voltaképpen egy szimpla adatbázisról és annak lekérdezéseiről szól. Az adatbázis -amelyet egy egyszerű .txt állomány reprezentál-, önmagában nehezen értelmezhető, viszont adataiban gondosan leválasztott a többi szoftverkomponensről, tehát az MVC-modell követelményeinek részlegesen megfelel. A lekérdezések azonban nagyon macerásak, sokfélék, bonyolultak lehetnek.

 

www.informatika-programozas.hu - Ezt most meg kell tanulni!

 

Készüljünk fel, hogy adatbázissal való ügyködések során nagyobbrészt ilyen jellegű problémákkal fogunk szembesülni, hiszen ahogy mondani szokták, adatbázist (elméletileg) csak egyszer kell felépíteni, utána pedig “csupán” karban kell azt tartani. És valóban, a karbantartásnak fontos részét képezik a lekérdezések. Sok esetben ezeket is viszonylag könnyű implementálni, azonban sokszor ez nem elég, hanem a lekérdezéseknek alapszintű formázást és értelmezést is kell adni. Ügyeljünk minderre munkánk során!


Bevallom őszintén, a kód első része nem az én munkám, az Internetről szedtem (már nem tudom honnan). Ha eltekintünk a szerzői jogi vitáktól, ez alapjában véve nem probléma; volt 1 feladat, amit sikerült rekord idő alatt megoldani. Ezért a gyorsaságért legtöbbször minden munkáltató hálás. Már csak azt kell ellenőriznünk, hogy a talált kód az optimális-e. Nyugodjunk meg: majdnem minden programozó kisebb-nagyobb mértékben ezt teszi. Jegyezzük meg a (félig humoros) mondást:

 

www.informatika-programozas.hu - Ezt most meg kell tanulni!

 

Junior és senior programozó közt csupán az a különbség, hogy az utóbbi jobban keres az Interneten.


Az alábbi programozási feladat a https://www.webotlet.hu/?p=2374 címről származik.

 

A Lajhar.txt sikeres eléréséhez és olvasásához az állományt tegyük be a projektmappába:

 

www.informatika-programozas.hu - Letöltés


Most pedig nézzük meg a specifikációt, azaz hogy mi a búbánatot kell leprogramoznunk:

Feladatok

Nézzük meg a futtatható Java-kódot:

 

www.informatika-programozas.hu - Futtatható Java-kód!

 

 

 

 

 

 

 

 

import java.io.*;
import java.util.*;

public class Main {

private static Map<String, Integer> sortByValue(Map<String, Integer> unsortMap) {
    List<Map.Entry<String, Integer>>list = new LinkedList<Map.Entry<String, Integer>>(unsortMap.entrySet());
    Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
    public int compare(Map.Entry<String, Integer> o1,
    Map.Entry<String, Integer> o2) {
    return (o1.getValue()).compareTo(o2.getValue());
    }
});

Map<String, Integer> sortedMap = new LinkedHashMap<String, Integer>();
    for (Map.Entry<String, Integer> entry : list) {
        sortedMap.put(entry.getKey(), entry.getValue());
    }
    return sortedMap;
}

public static <K, V> void printMap(Map<K, V> map) {
    for (Map.Entry<K, V> entry : map.entrySet()) {
        System.out.println(entry.getKey() + " " + entry.getValue() + " éves.");
    }
}

public static void main(String[] args) {
    List<String> lista = new ArrayList<>();
    HashMap<String, Integer> h = new HashMap<String, Integer>();
    int countNostenySzam = 0;
    int himUtodSzam = 0;

    List<String> himNevTomb = new ArrayList<>();
    List<String> nostenyNevTomb = new ArrayList<>();
    List<Integer> himUtodSzamTomb = new ArrayList<Integer>();
    List<Integer> nostenyUtodSzamTomb = new ArrayList<Integer>();

    String himUtod = "";
    String tempString = "";

try {
    BufferedReader olvaso = new BufferedReader(new FileReader("Lajhar.txt"));
    String sor;
    while ((sor = olvaso.readLine()) != null) {
        lista.add(sor);
    }
    for(int i = 0; i < lista.size(); i++) {
        System.out.println(i + ": " + lista.get(i));
        if(lista.get(i).contains("nosteny")) {
            countNostenySzam++;

            tempString = lista.get(i);
            String[] parts = tempString.split(";");
            String part1 = parts[0];
            String part2 = parts[1];
            nostenyUtodSzamTomb.add(Integer.parseInt(part2));

            tempString = lista.get(i-2);
            parts = tempString.split(";");
            part1 = parts[0];
            part2 = parts[1];
            nostenyNevTomb.add(part1);
        }


        if(lista.get(i).contains("him")) {
            himUtod = lista.get(i).substring(4, 5);
            int temp = Integer.parseInt(himUtod);
            himUtodSzam += temp;

            tempString = lista.get(i);
            String[] parts = tempString.split(";");
            String part1 = parts[0];
            String part2 = parts[1];
            himUtodSzamTomb.add(Integer.parseInt(part2));

            tempString = lista.get(i-2);
            parts = tempString.split(";");
            part1 = parts[0];
            part2 = parts[1];
            himNevTomb.add(part1);
        }
    tempString = lista.get(i);
    Character tempFirstChar = 'A';
    if (tempFirstChar.isUpperCase(tempString.charAt(0))) {
        String[] parts = tempString.split(";");
        String part1 = parts[0];
        String part2 = parts[1];
        int partInt2 = Integer.parseInt(part2);
        h.put(part1, partInt2);
        }
    }
    System.out.println();
    System.out.println("A nőstények száma: " + countNostenySzam);
    System.out.println("A hímutódok száma: " + himUtodSzam);

    System.out.println();

    System.out.println("Életkor szerint rendezve:");
    Map<String, Integer> sortedMap = sortByValue(h);
    printMap(sortedMap);

    System.out.println();

    for(int i = 0; i < himUtodSzamTomb.size(); i++) {
        for(int j = 0; j < nostenyUtodSzamTomb.size(); j++) {
            if(himUtodSzamTomb.get(i) == 0 || nostenyUtodSzamTomb.get(j) == 0) {
                continue;
            }
            if(himUtodSzamTomb.get(i) == nostenyUtodSzamTomb.get(j)) {
System.out.println(himNevTomb.get(i) + " és " + nostenyNevTomb.get(j)

                            + " párok " + himUtodSzamTomb.get(i) + " utóddal.");
            }
        }
    }
    olvaso.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
}
}

 

Végeredmény:

0: Mimi;8
1: 4.5
2: nosteny;2
3: Zippo;23
4: 5.4
5: him;5
6: Sid;10
7: 5.3
8: him;0
9: Alf;18
10: 4.9
11: him;3
12: Goonie;43
13: 4.1
14: nosteny;6
15: Luna;13
16: 4.6
17: nosteny;3
18: Iris;7
19: 3.9
20: nosteny;0

A nőstények száma: 4
A hímutódok száma: 8

Életkor szerint rendezve:
Iris 7 éves.
Mimi 8 éves.
Sid 10 éves.
Luna 13 éves.
Alf 18 éves.
Zippo 23 éves.
Goonie 43 éves.

Alf és Luna párok 3 utóddal.