A feladat leírását, melynek a megoldását közzéteszem innen töltheted le.
A letölthető tömörített állományokban megtalálod a NetBeans-ben megnyitható projecteket. Amennyiben Geany szerkesztővel kívánod megtekinteni a megoldást, akkor töröld ki a források elejéről a következő sorokat:
package Webotlet_e14maj_cimek_tomb; // vagy package Webotlet_e14maj_cimek_lista;
Két megoldást is mellékelek, az egyik tömböt használ az objektumok tárolására, a másik listát. A megoldásokban két osztály található. A Cim osztály felelős az adattárolásért, a Webotlet_e14maj_cimek_tomb vagy lista pedig a vezérlőprogram, mely a forrás beolvasását, valamint a feladatok megoldását tartalmazza.
A Cim osztály viszont nem csak az adattárolásért felelős. Található benne két metódus, bevezeto0 és csoport0 néven, melyek statikus osztálymetódusok. Ez azt jelenti, hogy az osztály példányosítása nélkül meghívhatók a Cim osztály nevére hivatkozva. Ezzel gyakorlatilag bármilyen címmel tesztelhetjük, hogy a rövidítések megfelelően működnek-e. Ha main()-t tartalmazó osztályunkban semmi más nem szerepel, csak ezeknek a metódusoknak a meghívása, akkor a Cim osztályból nem is kell objektumot létrehozni ahhoz, hogy tesztelhessük a rövidítést:
public static void main( String[] args ) { System.out.println( "2001:0000:0000:00f5:0000:0000:0000:0123" ); System.out.println( Cim.bevezeto0("2001:0000:0000:00f5:0000:0000:0000:0123") ); System.out.println( Cim.csoport0("2001:0000:0000:00f5:0000:0000:0000:0123") ); }
Ilyen esetben, ha a forrástól független adatokkal ugyanazokat a műveleteket kell elvégezni, akkor célszerű ilyen metódust írni abba az osztályba, ami majd a forrásból beolvasott adatokat tartalmazza. Így tetszőleges adatokkal is tesztelhető az adott metódus, valamint a forrásadatok feldolgozását is megoldja. Lássuk akkor a megoldásokat:
Cim osztály az adattárolásra és rövidítésre:
/** * * @author http://webotlet.hu */ package Webotlet_e14maj_cimek_lista; public class Cim { private String cim; private int tipus; private int sorszam; private boolean n18; public Cim( String s, int db ) { cim = s; sorszam = db; if( s.startsWith( "2001:0db8" ) ) { tipus = 0; } else if( s.startsWith( "2001:0e" ) ) { tipus = 1; } else { tipus = 2; } int nullak = 0; for( int i = 0; i < cim.length(); i++ ) { if( cim.charAt(i) == '0' ) { nullak++; } } n18 = nullak >= 18; } public String getCim() { return cim; } public int getTipus() { return tipus; } public int getSorszam() { return sorszam; } public boolean isN18() { return n18; } @Override public String toString() { return "Cim{" + "cim=" + cim + ", tipus=" + tipus + ", sorszam=" + sorszam + ", n18=" + n18 + '}'; } public static String bevezeto0( String c ) { StringBuilder sb = new StringBuilder(); String[] tomb = c.split(":"); for( String s : tomb ) { if( s.startsWith("000") ) { sb.append(s.substring(3)+":"); } else if( s.startsWith("00") ) { sb.append(s.substring(2)+":"); } else if( s.startsWith("0") ) { sb.append(s.substring(1)+":"); } else { sb.append(s+":"); } } sb.deleteCharAt(sb.length()-1); return sb.toString(); } public static String csoport0( String c ) { String c2 = Cim.bevezeto0(c); if( c2.contains(":0:0:0:0:0:0:0") ) { c2 = c2.replaceFirst(":0:0:0:0:0:0:0", ":"); } else if( c2.contains(":0:0:0:0:0:0") ) { c2 = c2.replaceFirst(":0:0:0:0:0:0", ":"); } else if( c2.contains(":0:0:0:0:0") ) { c2 = c2.replaceFirst(":0:0:0:0:0", ":"); } else if( c2.contains(":0:0:0:0") ) { c2 = c2.replaceFirst(":0:0:0:0", ":"); } else if( c2.contains(":0:0:0") ) { c2 = c2.replaceFirst(":0:0:0", ":"); } else if( c2.contains(":0:0") ) { c2 = c2.replaceFirst(":0:0", ":"); } else if( c2.contains(":0") ) { c2 = c2.replaceFirst(":0", ":"); } if( c2.endsWith(":") ) { c2 += ":"; } return c2; } }
Oké, tudom, hogy lehetne szebb és elegánsabb is a megoldás a rövidítésekre, de most a lényeg, hogy ne kombináld túl, hiszen az érettségi időre megy, és nem az optimális megoldást keressük. Néha a faék egyszerű megoldás a leghatékonyabb.
A main()-t tartalmazó osztály, mely a fájlkezelést és a feladatokat tartalmazza:
/** * * @author http://webotlet.hu */ package Webotlet_e14maj_cimek_tomb; import java.io.*; import java.util.Scanner; public class Webotlet_e14maj_cimek_tomb { public static void main( String[] args ) { String sor; RandomAccessFile raf; int db; Cim[] cimek; try { // 1. feladat raf = new RandomAccessFile("ip.txt","r"); db = 0; for( sor = raf.readLine(); sor != null; sor = raf.readLine() ) { db++; } cimek = new Cim[db]; db = 0; raf.seek(0); for( sor = raf.readLine(); sor != null; sor = raf.readLine() ) { cimek[db++] = new Cim(sor, db); } raf.close(); // 2. feladat System.out.println("\n2. feladat"); System.out.println(db+" sor van az allomanyban."); // 3. feladat System.out.println("\n3. feladat"); int min = 0; for( int i = 1; i < cimek.length; i++ ) { if( cimek[i].getCim().compareTo(cimek[min].getCim() ) < 0 ) { min = i; } } System.out.println( "Az allomanyban szereplo legalacsonyabb cim:\n"+ cimek[min].getCim() ); // 4. feladat System.out.println("\n4. feladat"); int[] tipusDb = new int[3]; for( Cim c : cimek ) { tipusDb[ c.getTipus() ]++; } System.out.println("Dokumentacios cim: "+tipusDb[0]+" darab"); System.out.println("Globalis egyedi cim: "+tipusDb[1]+" darab"); System.out.println("Helyi egyedi cim: "+tipusDb[2]+" darab"); // 5. feladat RandomAccessFile ki = new RandomAccessFile("sok.txt","rw"); // ha esetleg létezne a fájl, töröljük a tartalmát ki.setLength(0); for( Cim c : cimek ) { if( c.isN18() ) { ki.writeBytes(c.getSorszam()+" "+c.getCim()+"\n"); } } // 6. feladat System.out.println("\n6. feladat"); Scanner sc = new Scanner(System.in); System.out.print("Adj meg egy sorszamot: "); int rcim = sc.nextInt()-1; System.out.println(cimek[rcim].getCim() ); System.out.println(Cim.bevezeto0( cimek[rcim].getCim() ) ); // 7. feladat System.out.println("\n7. feladat"); System.out.println(Cim.csoport0( cimek[rcim].getCim() ) ); } catch( IOException e ) { System.err.println("HIBA"); } } }
A Cim osztálynak van a sorszáma, a konstruktorban ez a db paraméter, ami egyenlő a sorszámmal.
De mitől nő db?
Nem találom a magyarázatot, honnan tudja a program, hogy a sorszámnak egyel nőni kell.