Quale astrazione usare per la somma gerarchica dalla lista ordinata

0

Sto cercando un'astrazione da cui risolvere una classe di problemi simile al seguente:

Ho questo ResultSet ordinato (in questo caso ordinato per NATION, REGION, DISTRICT, COUNTRY):

CITY' Table

| NATION | REGION | DISTRICT | COUNTRY |    POPULATION |
--------------------------------------------------------
ITALIA     CAMPANIA CE          AVERSA          70.000
ITALIA     CAMPANIA CE          CASERTA        500.000
ITALIA     CAMPANIA CE          MARCIANISE   5.000.000
ITALIA     CAMPANIA SA          BATTIPAGLIA     50.000
ITALIA     CAMPANIA SA          EBOLI           60.000
ITALIA     CAMPANIA SA          SARNO           70.000
ITALIA     LAZIO    RM          CAMPAGNANO      50.000
ITALIA     LAZIO    RM          FORMELLO       500.000
ITALIA     LAZIO    RM          ROMA         5.000.000
ITALIA     LAZIO    VT          BOLSENA         50.000
ITALIA     LAZIO    VT          FALERIA         60.000
ITALIA     LAZIO    VT          NEPI            80.000
....
ALBANIA ...
...
RUSSIA....
...

Voglio ottenere questo risultato come un elenco di oggetti City in cui verranno inclusi i diversi totali (raggruppamenti) della popolazione.

| NATION | REGION | DISTRICT |  COUNTRY   |  POPULATION |
--------------------------------------------------------
ITALIA     CAMPANIA CE          AVERSA          70.000
ITALIA     CAMPANIA CE          CASERTA        500.000
ITALIA     CAMPANIA CE          MARCIANISE   5.000.000
ITALIA     CAMPANIA SA          BATTIPAGLIA     50.000
ITALIA     CAMPANIA SA          EBOLI           60.000
ITALIA     CAMPANIA SA          SARNO           70.000
ITALIA     LAZIO    RM          CAMPAGNANO      50.000
ITALIA     LAZIO    RM          FORMELLO       500.000
ITALIA     LAZIO    RM          ROMA         5.000.000
ITALIA     LAZIO    VT          BOLSENA         50.000
ITALIA     LAZIO    VT          FALERIA         60.000
ITALIA     LAZIO    VT          NEPI            80.000
...         ...     ...         ...             ...
TOT. CE                                      5.570.000
TOT. SA                                        230.000
TOT. RM                                      5.550.000
TOT. VT                                        240.000
TOT. CAMPANIA                                5.800.000
TOT. LAZIO                                   5.790.000
TOT. ITALIA                                 11.590.000
ALBANIA     ...     ...     ...                 ...
...         ...     ...     ...                 ...
TOT. XX                                         XXX
TOT. YY                                         YYY
...                                             ...
TOT. ALBANIA                                    ZZZ
RUSSIA      ...     ...     ...                 ...
...         ...     ...     ...                 ...
TOT. XX                                         XXX
TOT. YY                                         YYY
...                                             ...
TOT. RUSSIA                                     ZZZ
...

Ho pensato ad un algoritmo in cui utilizzo una mappa per analizzare le modifiche che si verificano per ogni colonna.

Mappa mappa = nuova LinkedHashMap < > (); // preserva l'ordine di inserimento List cityList;

class City {
    private BigDecimal population = 0;  
    ...
    //getter/setter...

    public static final City createBean(ResultSet rs){
        City city = new City();
        population  = rs.getBigDecimal("POPULATION");
        ...
        return city;
    }

    public add(City bean) {
        this.population.add(bean.getPopulation());
        ...
    }
}

Algoritmo:

boolean isFirst = true;
ResultSet rs = .... from persistence
while(rs.next()) {
    City current = City.createBean(rs);
    cityList.add(current);  
    if(isFirst) {
        isFirst = false;
        map.put(current.getNation(),new City()); //tot.nation   
        map.put(current.getRegion(),new City()); //tot.region
        map.put(current.getDistrict(),new City()); //tot.district
    }

    if(!map.containsKey(current.getNation())) { //main breaking for nation
        //there was a change of nation then load the map on the cityList
        forach key in map 
            cityList.add(map.getKey(key));
        map.clear();
        map.put(current.getNation(),new City()); //tot.nation   
        map.put(current.getRegion(),new City()); //tot.region
        map.put(current.getDistrict(),new City()); //tot.district
    }

    map.get(current.getNation()).add(current);
    map.get(current.getRegion()).add(current);
    map.get(current.getDistrict()).add(current);
}

Puoi indirizzarmi verso un design con cui puoi astrarre questa logica?

Vorrei produrre un componente con queste caratteristiche:     - Non associato dal sistema di persistenza (ResultSet)     - Non associato alla città

Grazie a tutti per ogni feedback che mi darai.

    
posta Alessandro Forcuti 09.04.2018 - 14:42
fonte

1 risposta

1

In base a ciò che hai scritto sopra, sarei propenso ad affrontare il problema nel modo seguente:

  1. Mentre recuperi le città da ResultSet , alloca ogni CityRecord un identificativo univoco (assumiamo che il tipo sia CityId ).
  2. Metti questi record in una sorta di Map che ti consente di cercare CityRecord in CityId .
  3. Hai tre% di% di escluso che ti consentono di cercare un Map per nazione, regione e distretto rispettivamente.
  4. Dovresti quindi calcolare il totale della popolazione per una regione / nazione / distretto cercando il Collection<CityId> usando le mappe nel passaggio 3, quindi convertendolo in Collection<CityId> usando la mappa nel passaggio 2, e infine riducendo questo sommando le popolazioni dei record di dati associati.
risposta data 09.04.2018 - 16:40
fonte

Leggi altre domande sui tag