Java SE 8 Documentation

Gyakorlás

A megoldáshoz tartozó osztályok kerüljenek a phonebook csomagba!

phonebook.CountryCode

  • Készítsünk egy CountryCode osztályt, amely egy állományból olvassa be a különböző országokhoz tartozó hívókód és országkódok közti összerendeléseket! Az állományunk szöveges formátumú, és a következő alakban tartalmazza a bejegyzéseket:

    99[9] AA

    A [ és ] jelek közti rész a bemenet opcionális elemeit jelöli, a 9 tetszőleges decimális számjegyet, az A nagybetűs (A és Z) közti karaktert.

    Mintaállomány

  • Az osztálynak legyen egy konstruktora, amely paraméterként megkapja az összerendeléseket tartalmazó állomány elérési útját (String értékként), megnyitja és beolvassa belőle az adatsorokat! Azokat a sorokat hagyja ki, amelyet nem tud értelmezni (mert például nem teljesítik a fentebb összefoglalt formai elvárásainkat)!

  • Legyen egy olyan metódus (findCountry()), amellyel egy országkód számszerű ábrázolása alapján vissza tudjuk keresni a neki megfelelő kódot! Az országkód egy String típusú érték lesz. Ha nem talál ilyen értéket, akkor azt egy üres, null referenciával jelezze!

  • Legyen egy olyan metódus (findCountryCode()), amellyel egy országkód szöveges ábrázolása alapján vissza tudjuk keresni a neki megfelelő számot! Ha nem talál ilyen értéket, akkor egy null referenciát adunk vissza helyette!

  • A toString(), equals() és hashCode() metódusok ennél az osztálynál nem támogatottak, ezért váltsanak ki UnsupportedOperationException kivételt!

phonebook.PhoneNumber

  • Ábrázoljunk telefonszámokat a PhoneNumber osztály megadásával, amelyben a következő jellemzőket tároljuk el:

    • országkód (country, szövegesen, például: "HU", "RO", "SK", "GR", "UK", stb.);
    • körzetkód (areaCode, egész szám);
    • telefonszám (number, egész szám, a fennmaradó rész).
  • Készítsünk el hozzá egy példányosító metódust (make()), amely paraméterként megkap egy CountryCode objektumot, egy telefonszámot szövegesen (String típusú értékként) és ez utóbbiból, amennyiben sikerül beolvasni (tehát van országkódja, körzetkódja és utána szerepel legalább 6, legfeljebb 8 számjegy), létrehoz egy PhoneNumber objektumot! A bemenet elvárt formátuma az alábbi:

    +99[ ]99[ ]999999[99]

    A [ és ] jelek közti rész a bemenet opcionális elemeit jelöli, a 9 pedig tetszőleges decimális számjegyet.

    Ha a bemenet értelmezése nem sikerül, akkor adjunk vissza null referenciát! Ügyeljünk arra, hogy az osztálynak másképpen ne jöhessenek létre példányai! Igyekezzünk kezelni az átalakítás során elforduló kivételeket (pl. NumberFormatException) is.

    Az országkód feloldásánál értelemszerűen a paraméterként kapott CountryCode típusú értéket kell majd alkalmaznunk.

  • Az osztályhoz adjuk meg a toString() metódust! Az itt létrehozandó szöveg a következő formátumú legyen:

    (AA) 99 999999[99]
     ^   ^  ^
     |   |  '- telefonszám
     |   '---- körzetkód
     '-------- országkód
  • Adjuk meg a equals() és hashCode() metódusokat, amelyek akkor tekintenek két PhoneNumber értéket egyenlőnek, amikor azok adattagjai rendre megegyeznek!

  • Tegyük az osztályban tárolt információkat írásvédetté!

  • Legyenek a PhoneNumber objektumok rendezhetőek! A rendezésnél elsőként az országkód, majd a körzetkód, végül a telefonszám szerint rendezzünk növekvőleg.

phonebook.PhoneBook

  • Írjunk egy PhoneBook osztályt, amelyben telefonszámokat (PhoneNumber objektumokat) tudunk karbantartani! Az osztálynak legyen többféle konstruktora:

    • Paraméter nélkül: hozzon létre egy üres tárolót, amelyet később majd bővíteni tudunk.

    • Állományból: paraméterként megkapja egy állomány elérési útvonalát, amelyet aztán beolvas soronként és megpróbál ezekből kinyerni bejegyzéseket. Amennyiben ez nem sikerül, úgy az adott sor a feldolgozás szempontjából figyelmen kívül hagyja. A sorok elvárt formátuma a következő:

      telefonszám|név

      ahol a telefonszám formátuma a PhoneNumber típus leírásának megfelelő szöveget takar, majd a sor | karakter utáni része a számhoz tartozó személy nevét tárolja.

      Ha az állomány egyetlen szabályos sort sem tartalmaz, akkor ez a konstruktor lényegében úgy fog működni, mint az előbbi.

  • Adjuk hozzá az addItem() metódust, amely segítségével a PhoneBook objektumban tárolt eddigi értékekhez tudunk hozzáfűzni egy újabb elemet! Ennek jellemzőit (telefonszám, név) a metódus paramétereiként kapjuk meg. A beszúrásnál ügyeljünk arra, hogy egy személy több számmal és egy szám több személlyel is kapcsolatban lehet, viszont ugyanazt a személyt ugyanazzal a számmal többször nem vehetjük fel. Ez utóbbi esetben a metódus váltson ki egy IllegalArgumentException típusú kivételt.

  • Készítsünk egy phoneNumbers() metódust, amellyel ki tudjuk keresni az objektumban tárolt információkból, hogy egy adott személyhez milyen telefonszámok tartoznak! Ennek megfelelően a metódus paraméterként a keresett személy nevét kapja meg, és a visszatérési értéke pedig a telefonszámok (PhoneNumber értékek) sorozata. Ha nem az adott személyhez nem találhatók telefonszámok, akkor adjunk vissza null referenciát!

  • Hasonlóan ez előzőhöz, készítsünk egy names() metódust, amellyel ki tudjuk keresni, hogy egy adott (PhoneNumber típussal megadott) telefonszám kihez vagy kikhez tartozhat a telefonkönyvben! Ezeket egy sorozatként adjuk vissza, illetve ha nem található, akkor adjunk vissza null referenciát. Próbáljuk meg mind a két keresést hatékonyan megvalósítani!

  • Definiáljuk a PhoneBook esetén a toString() metódust, amellyel egy telefonkönyv tartalmát (pontosabban a benne tárolt nevek és telefonszámok jegyzékét) tudjuk szövegszerűen megjeleníteni! Ennek a formátuma legyen ugyanolyan, mint a beolvasásnál (mivel később képesnek kell lennünk a saját magunk generált állományokat is visszaolvasnunk).

  • Az osztály valósítsa meg az Iterable interfészt, hogy szükség esetén a "foreach" szerkezettel is be tudjuk járni, illetve a bejárás aktuális pozíciójában levő elem törlését is engedjük meg!

Főprogram

  • Hozzunk létre egy alkalmazást, amely paranccsori paraméterként megkap egy telefonszámokat tároló állományt, egy nevet és egy telefonszámot, majd a nevet és a telefonszámot rögzíti az állományban! Ha az állomány nem létezik, akkor hozzunk létre üresen!

  • Ha csak egy nevet, vagy csak egy telefonszámot adunk meg az állomány neve után, akkor keresse ki a neki megfelelő adatokat, és írja ki a keresés eredményét a szabványos kimenetre!

  • Nem megfelelő paraméterek esetén tájékoztassa a felhasználót a program helyes használatáról!

  • A program kezeljen egy .cfg kiterjesztésű konfigurációs állományt, amelyet az aktuális könyvtárban keres, és azt betöltve meg tudja állapítani, hogy merre keresse az országkódok feloldásához szükséges állományt! Ebben az állományban lényegében annak az állományak az elérési útvonala található.

  • A rögzítés során az elmentett állományt mindig tartsa rendezetten elsődleges név, másodlagosan pedig telefonszámok szerint!