Java egyperces – Kombinált megszámlálás megoldása

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.

Vélemény, hozzászólás?

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük

*

This site uses Akismet to reduce spam. Learn how your comment data is processed.