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

*

Ez az oldal az Akismet szolgáltatást használja a spam csökkentésére. Ismerje meg a hozzászólás adatainak feldolgozását .