Gyakorlati alapok II.
Számváltás adatbázisból
Az az igazság, hogy ez a fejezet kilóg a Honlaptérképben fentről lefelé haladó, következetes gyakorlási sorozatból...
...hiszen fájlkezelés (vele kötelező kivételkezelés) található benne, amelyekkel azonban csak később fogunk találkozni. Tehát a fejezet eredményes tanulmányozásához először el kell olvasnunk és meg kell értenünk a következő fogalmakat:
Bevezetésként egy szabványos, gyakran előforduló fájlművelettel kezdjük, amely futtatható Java-kód már ismertetésre került az egyik fejezetben:
-
A Római és arab számlista című fejezetben ismertetett algoritmus segítségével készítettünk egy arab-római szám listát és elmentettük valahová .txt formátumban, adatbazis néven.
-
Az adatbazis elérése útját helyesen beállítva és az alábbi kódot megfelelően futtatva elértük annak teljes tartalmát, amely 3999 db arab-római számpár, egyenlőségjellel ( = ) elválasztva egymástól.
-
Az adatbazis letölthető innen:
adatbazis.txt (64 KB)
import java.io.*;
public class Main {
public static void main(String[] args) {
FileReader reader = null;
try {
reader = new FileReader("D:\\adatbazis.txt");
BufferedReader br = new BufferedReader(reader);
String line = br.readLine();
while(line != null) {
System.out.println(line);
line = br.readLine();
}
} catch (FileNotFoundException fnfe) {
System.out.println("A fájl nem található!");
fnfe.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
}
Végeredmény:
1 = I
2 = II
3 = III
4 = IV
5 = V
6 = VI
7 = VII
8 = VIII
9 = IX
10 = X
stb.
Korrekt fájlmegnyitás esetén a teljes fájltartalmat az adatTomb nevű tárolótömbbe pakoljuk, amely onnan szabadon elérhetővé válik:
try {
reader = new FileReader("D:\\adatbazis.txt");
BufferedReader br = new BufferedReader(reader);
do{
line = br.readLine();
adatTomb[szamlalo] = line;
szamlalo++;
}while(line != null);
Ezután szét kell választanunk az adatTomb elemeit, hiszen a bennük tárolt információ ömlesztve tárolja az arab-római számpárokat, például 8 = VIII. Ezt a split() függvény segítségével tehetjük meg, az elválasztást az = jel mentén hajtjuk végre (adatTomb[i].split("=")), amely során azonban a trim() függvényt is be kell vetnünk, hogy leválasszuk a számokról az üres szóköz (whitespace) karaktereket:
for(int i = 0; i < adatTomb.length; i++){
if(adatTomb[i] != null){
String[] temp = adatTomb[i].split("=");
arabSzamTomb[i] = temp[0].trim();
romaiSzamTomb[i] = temp[1].trim();
}
}
A leválasztás után a 2 tömb között az egyetlen logikai kapcsolat az lesz, hogy az összetartozó számpárok indexe azonos, például arabSzamTomb[1] és romaiSzamTomb[1], azaz 2 = II. Objektumorientált szemlélet szempontjából ez nem valami elegáns megoldás, de jelenlegi céljainknak most megfelelő.
Az azonos indexelés miatt a keresés könnyű: kizárólag az indexegyezések a fontosak, például:
for(int i = 0; i < adatTomb.length; i++){
if(romaiSzamTomb[i] != null &&
romaiSzamTomb[i].equals(keresettString)){
System.out.println(arabSzamTomb[i]);
talalat = true;
}
Ha rossz adatbevitel történt vagy a keresett elem nem található, akkor erről egyszerű üzenet formájában értesítjük a felhasználót:
if(talalat == false){
System.out.println("A keresett elem nem található!");
}
Nézzük meg a futtatható Java-kódot!
import java.io.*;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
String[] adatTomb = new String[4000];
String[] arabSzamTomb = new String[4000];
String[] romaiSzamTomb = new String[4000];
Scanner scanner = new Scanner (System.in);
FileReader reader = null;
int szamlalo = 0;
String line = null;
boolean talalat = false;
System.out.println ("Kérem, hogy adja meg a keresett arab vagy római
számot!");
String keresettString = scanner.nextLine();
try {
reader = new FileReader("D:\\adatbazis.txt");
BufferedReader br = new BufferedReader(reader);
do{
line = br.readLine();
adatTomb[szamlalo] = line;
szamlalo++;
}while(line != null);
for(int i = 0; i < adatTomb.length; i++){
if(adatTomb[i] != null){
String[] temp = adatTomb[i].split("=");
arabSzamTomb[i] = temp[0].trim();
romaiSzamTomb[i] = temp[1].trim();
}
}
for(int i = 0; i < adatTomb.length; i++){
if(romaiSzamTomb[i] != null &&
romaiSzamTomb[i].equals(keresettString)){
System.out.println(arabSzamTomb[i]);
talalat = true;
}
else if(arabSzamTomb[i] != null && arabSzamTomb[i].equals(keresettString)){
System.out.println(romaiSzamTomb[i]);
talalat = true;
}
}
if(talalat == false){
System.out.println("A keresett elem nem található!");
}
} catch (FileNotFoundException fnfe) {
System.out.println("A fájl nem található!");
fnfe.printStackTrace();
} catch (IOException ioe) {
ioe.printStackTrace();
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
}
}
Végeredmény:
Kérem, hogy
adja meg a keresett arab vagy római számot!
CCXXXIV
234
Most pedig nézzük meg a fenti probléma objektumorientált-közeli megvalósítását!
import java.io.*;
import java.util.Scanner;
public class Main {
public static ArabRomai[] szamok = new ArabRomai[4000];
public static void init() throws IOException {
Scanner scanner = new Scanner(System.in);
FileReader reader = null;
int szamlalo = 0;
String line = null;
reader = new FileReader("D:\\adatbazis.txt");
BufferedReader br = new BufferedReader(reader);
do {
line = br.readLine();
if (line ==
null) {break;}
String[] tmp
= line.split("=");
szamok[szamlalo] = new ArabRomai(Integer.parseInt(tmp[0].trim()), tmp[1].trim());
szamlalo++;
} while (line != null);
br.close();
}
public static int getArabByRomai(String romai) {
for (int i = 0; i < szamok.length; i++) {
if (szamok[i] != null &&
szamok[i].getRomaiSzam().equals(romai)) {
return szamok[i].getArabSzam();
}
}
System.out.println("Nem található a szám: " + romai);
return -1;
}
public static String getRomaiByArab(int arab) {
for (int i = 0; i < szamok.length; i++) {
if (szamok[i] != null && szamok[i].getArabSzam() == arab) {
return szamok[i].getRomaiSzam();
}
}
System.out.println("Nem található a szám: " + arab);
return "Nem található a szám.";
}
public static void main(String[] args) {
try {
Main.init();
System.out.println(
Main.getArabByRomai("X"));
System.out.println(
Main.getRomaiByArab(127));
System.out.println(
Main.getArabByRomai("MIMI"));
} catch (IOException e) {
e.printStackTrace();
}
}
}
Végeredmény:
10
CXXVII
Nem található a szám: MIMI
-1