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.
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:
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:
Most pedig nézzük meg a
specifikációt, azaz hogy mi a búbánatot kell leprogramoznunk:
-
A Lajharok.txt fájlban lajhárok adatai találhatóak. Minden lajhár adatai 3 egymás utáni sorban szerepelnek. Az egyes sorok közül azonban vannak olyanok, amelyek egynél több adatot tartalmaznak.
-
A fájl szerkezete a következő:
-
név;életkor
-
testtömeg
-
neme;utódok
-
-
Az egyes adatok magyarázata:
-
név - az állat neve,
-
életkor - az állat életkora években megadva (egész szám),
-
testtömeg - az állat tömege kilogrammban megadva (valós szám),
-
neme - a lajhár neme (hím, nőstény),
-
utódok - a lajhár utódainak száma.
-
Feladatok
-
Olvasd be és tárold el egy tömbbe az állatokat!
-
Oldd meg a következő feladatokat és írd ki a képernyőre az eredményeket!
-
Hány nőstény lajhár adatai vannak a fájlban?
-
Hány kölyke van a hímeknek?
-
Rendezd a lajhárokat életkor szerint növekvő sorrendbe!
-
Sikeres pároknak tekintjük azokat a hímeket és nőstényeket, akik kölykökkel rendelkeznek.
-
Kik lehetnek párok a lajhárok között, ha az azonos kölyökszámmal rendelkezőket egy párnak vesszük?
Nézzük meg a futtatható Java-kódot:
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.