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.