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.
