Gyakorlati alapok III.
Collection példakód - Lekérdezések szövegben
Ebben a fejezetben a
Map-kollekció speciális tulajdonságait használjuk ki. A
feladat a következő:
-
Hányféle karakter található a szövegben?
-
Melyik a leggyakoribb karakter és mennyi előfordulással?
Pontosan erre való a Map, hiszen kulcs-értékpárokat tartalmaz, azaz lényegében nem kell tennünk mást, mint a kulcsokhoz rendeljük a karaktereket, értékeiket pedig (azaz itt előfordulásuk számát) egyszerűen megszámoljuk.
Az algoritmus alrutinjai a következők:
-
szövegbeolvasás alapszintű (kötelező) kivételkezeléssel,
-
a szöveg karaktereinek szétválasztása (keys), egyúttal előfordulásuk értékeinek betöltése (values) a Map-objektumba,
-
elemek kiírása Iterator-objektum segítségével, egyúttal gyakoriság megszámlálása,
-
maximumkiválasztás (leggyakoribb karakter),
-
eredmények formázott kiírása.
Az alapszöveg József Attila Kertész leszek című verse:
A letöltött .txt állományt közvetlenül másoljuk a projektmappába. Itt azonban akad 1 kis probléma. A vers eredeti tagolásban így néz ki:
Kertész leszek, fát nevelek,
kelő nappal én is kelek,
nem törődök semmi mással,
csak a beojtott virággal.
Minden beojtott virágom
kedvesem lesz virágáron,
ha csalán lesz, azt se bánom,
igaz lesz majd a virágom.
Tejet iszok és pipázok,
jóhíremre jól vigyázok,
nem ér engem veszedelem,
magamat is elültetem.
Kell ez nagyon, igen nagyon,
napkeleten, napnyugaton -
ha már elpusztul a világ,
legyen a sírjára virág.
Ilyen formázás során azonban egy, először kis sem írt, ezért megfejthetetlennek tűnő karakterbe futunk 18 db előfordulással, amely jelenség egyébiránt teljesen megbontja az egységes formázást. Az ok valójában a láthatatlan új sor utasítás. Ezzel a problémával én a jelen fejezet keretein belül most nem foglalkozom, helyette a vers új sor utasítás nélküli verzióját is publikálom, illetve az alábbi kód ezt futtatta:
Kertész leszek, fát nevelek,kelő nappal én is kelek,nem törődök semmi mással...
Nagyon szívesen publikálnék olyan megoldást, amelyik az új sor utasítás megoldásával is foglalkozik.
Egyúttal arra is készüljünk fel, hogy az alapként felhasznált szöveges állomány és az Eclipse különböző karakterkódolást használhat, amely furcsa karakterértelmezésekben tetőzhet, főként a magyar nemzeti karakterek esetében.
Nézzük meg a futtatható Java-kódot:
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception{
HashMap<Character, Integer> hashmap = new HashMap<Character,
Integer>();
Reader olvaso = null;
try {
olvaso = new FileReader("Kertesz.txt");
int karakter;
while ((karakter = olvaso.read()) !=
-1) {
Character
character = (char)karakter;
String
bemenetiString = character.toString();
if(bemenetiString.equals("
")){
continue;
}
for( int i =
0; i < bemenetiString.length(); i++ ) {
if (hashmap.containsKey(bemenetiString.charAt(i))) {
hashmap.put(bemenetiString.charAt(i), (int)hashmap.get(bemenetiString.charAt(i))
+ 1);
} else {
hashmap.put(bemenetiString.charAt(i), 1);
}
}
}
int maxValue = 0;
char maxChar = '0';
int count = 0;
Set<Map.Entry<Character, Integer>> gyakorisag =
hashmap.entrySet();
Iterator<Map.Entry<Character, Integer>> iterator =
gyakorisag.iterator();
while(iterator.hasNext()){
Map.Entry<Character, Integer> elem = iterator.next();
System.out.println ((count + 1) + ". elem: '" + elem.getKey()
+ "' " + elem.getValue() + " db");
count++;
if(elem.getValue() > maxValue) {
maxValue = elem.getValue();
maxChar = elem.getKey();
}
}
System.out.println ("\nHányféle karakter található a szövegben? " +
count + " db.");
System.out.println
("A leggyakoribb karakter: " + "'" + maxChar + "' " + maxValue + " db
előfordulással.");
olvaso.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Végeredmény:
1. elem: 'K' 2 db
2. elem: 'M' 1 db
3. elem: 'ő' 2 db
4. elem: 'T' 1 db
5. elem: 'á' 15 db
6. elem: 'a' 24 db
7. elem: 'b' 3 db
8. elem: 'c' 2 db
9. elem: 'd' 5 db
10. elem: 'e' 44 db
11. elem: 'f' 1 db
12. elem: 'g' 16 db
13. elem: 'h' 3 db
14. elem: 'é' 4 db
15. elem: 'i' 15 db
16. elem: 'j' 7 db
17. elem: 'k' 12 db
18. elem: 'l' 22 db
19. elem: ',' 14 db
20. elem: 'm' 17 db
21. elem: 'í' 2 db
22. elem: '-' 1 db
23. elem: 'n' 22 db
24. elem: '.' 4 db
25. elem: 'o' 14 db
26. elem: 'p' 7 db
27. elem: 'r' 14 db
28. elem: 's' 19 db
29. elem: 'ó' 2 db
30. elem: 't' 17 db
31. elem: 'u' 3 db
32. elem: 'v' 10 db
33. elem: 'ö' 2 db
34. elem: 'y' 5 db
35. elem: 'z' 13 db
36. elem: 'ü' 1 db
Hányféle karakter található a szövegben? 36 db.
A leggyakoribb karakter: 'e' 44 db előfordulással.