Csak akkor olvass tovább, ha az Kombinált megszámlálás feladatot megoldottad, vagy nem sikerült megoldani.
Az alap feladatot a fenti linken megtalálod, az ott bemeneti adatokat fogom használni.
A feladatot két osztály írásával oldom meg. Először kell egy Hivas osztály, amely a beolvasott adatokat tárolja, és azokból különféle tulajdonságokat számít ki. A tulajdonságokból az óra és másodperc tárolását kihagytam, ennek a feladatnak nincs rá szüksége. Természetesen ha híváshossz vagy valami más számított adatra lenne szükség, akkor azokat is tárolnám a megfelelő helyen.
/** * * @author http://webotlet.hu */ package webotlet_kombinaltmegszamlalas; public class Hivas { private String szam; private String ido; private int ora; private boolean csucs; private boolean mobil; public Hivas(String[] tomb) { szam = tomb[ 0 ].substring( 3 ); ido = tomb[ 1 ]; ora = Integer.parseInt(ido.split( ":" )[ 0 ]); csucs = ora >= 8 && ora < 18 ; mobil = szam.startsWith( "21" ) || szam.startsWith( "31" ) || szam.startsWith( "71" ); } public int getOra() { return ora; } public boolean isCsucs() { return csucs; } public boolean isMobil() { return mobil; } } |
Akkor jöjjön az osztály, mely a fájlkezelést végzi, megszámolja a megfelelő tulajdonságú objektumokat és kiírja a végeredményt:
/** * * @author http://webotlet.hu */ package webotlet_kombinaltmegszamlalas; import java.io.*; import java.util.ArrayList; public class Webotlet_KombinaltMegszamlalas { public static void main(String[] args) { ArrayList<Hivas> hivasok = new ArrayList<>(); String sor; RandomAccessFile raf; try { raf = new RandomAccessFile( "kombihivasok.csv" , "r" ); raf.readLine(); for ( sor = raf.readLine(); sor != null ; sor = raf.readLine() ) { hivasok.add( new Hivas( sor.split( ";" ) ) ); } raf.close(); // ora: cs, ncs, m, v // cs - csucsido, ncs - nem csucsido, m - mobil, v - vezetekes int [][] db = new int [ 24 ][ 4 ]; int ora; for ( Hivas h : hivasok ) { ora = h.getOra(); // csucsideju, nem csucsideju if ( h.isCsucs() ) db[ora][ 0 ]++; else db[ora][ 1 ]++; // mobil, vezetekes if ( h.isMobil() ) db[ora][ 2 ]++; else db[ora][ 3 ]++; } for ( int i = 0 ; i < db.length; i++ ) { System.out.println( i+ ". ora: " +db[i][ 0 ]+ ", " +db[i][ 1 ]+ ", " +db[i][ 2 ]+ ", " +db[i][ 3 ] ); } } catch ( IOException e ) { System.err.println( "HIBA" ); } } } |
Ha megfigyeled, a többszörös megszámlálást kombináltam egy többdimenziós tömbbel. A tömb indexei jelentik azt az órát, melyen belül külön össze kell számolni az adott tulajdonságú objektumokat. A 2. dimenzió, az oszlopok, gyakorlatilag azt a 4 adatot tartalmazza, ahány fajta számot kell tárolni az egyes órákhoz. Az oszlopok száma természetesen bővíthető, ha a feladat úgy kívánja, amire oda kell figyelni az az, hogy melyik oszlop milyen megszámlált tulajdonságot jelent.