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.