• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Grupowanie danych w obiekcie, Java

Object Storage Arubacloud
0 głosów
483 wizyt
pytanie zadane 29 czerwca 2019 w Java przez magicznyukf Początkujący (260 p.)

Próbuję rozwiązać pewne zadanie. Otóż wczytuję z pliku csv dane, które wygladają tak:

Rok,Kwartal,Miesiac,Tydzien,DzienT,Dzien,Data,Swieto,Produkt_ID,Kod,Producent,Grupa_produktowa,Kategoria,Miasto,Wojewodztwo,Region,Potencjal,Platnosc,Kanal,Ilosc,Cena,cena_sprzedazy,Koszt_zm,Koszt_st,Marza_br,Promocja,Powiat_ID,Wojew_ID
2004,1,1,0,4,1,01 stycznia 2004,T,5,ER7448C,Electrolux,Lodówki,AGD,Jelenia Góra,Dolnośląskie,Śląsk,Duży,,,,"952,00 zł",,"0,0 zł","476,0 zł",,,6,1
2004,1,1,0,4,1,01 stycznia 2004,T,15,WM08A260PL,Simens,Pralki,AGD,Jelenia Góra,Dolnośląskie,Śląsk,Duży,,,,"1 359,00 zł",,"0,0 zł","509,6 zł",,,6,1
2004,1,1,0,4,1,01 stycznia 2004,T,20,21PT182004,Philips,Telewizory,RTV,Jelenia Góra,Dolnośląskie,Śląsk,Duży,,,,"685,00 zł",,"0,0 zł","308,3 zł",,,6,1
2004,1,1,0,4,1,01 stycznia 2004,T,30,MHC-RG270,Sony,Hi-Fi,Audio,Jelenia Góra,Dolnośląskie,Śląsk,Duży,,,,"758,00 zł",,"0,0 zł","303,2 zł",,,6,1

Utworzyłem klasę, która przechowuje wszystkie kolumny.

public class AGD_COMPLEX {


    String rok, kwartal, miesiac, tydzien, dzien, produkt_id, powiat_id, wojew_id, data, kod, producent, grupa_produktowa, kategoria, miasto, wojewodztwo, region, potencjal, platnosc, kanal, ilosc, cena, cena_sprzedazy, koszt_zm, koszt_st, marza_br, promocja;

//gettery i settery dalej

Napisałem coś takiego, żeby zaimportować dane i wyświetlić.

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class Zadanie {
    public static void main(String[] args) throws IOException {

        String csvFile = "src/AGD.csv";
        String line;
        String cvsSplitBy = ",";

        try (BufferedReader br = new BufferedReader(new FileReader(csvFile))) {

            while ((line = br.readLine()) != null) {

                // use comma as separator
                String[] csv = line.split(cvsSplitBy);

                AGD_COMPLEX agd_complex = new AGD_COMPLEX();
                agd_complex.grupa_produktowa=csv[11];
                agd_complex.platnosc=csv[17];
                agd_complex.wojewodztwo=csv[14];
                agd_complex.miesiac=csv[2];
                agd_complex.rok=csv[0];
                agd_complex.cena=csv[20];

                List<AGD_COMPLEX> list = new ArrayList<>();

                list.add(agd_complex);
                System.out.println(list.toString());

                 //System.out.println(agd_complex.toString());

            }

        } catch (IOException e) {
            e.printStackTrace();
        }

    }
}

Teraz chciałbym pogrupować dane w taki sposób, ze np. dla wszystkich pralek z takiego województwa obliczyć średnią cenę. Jak mogę to zrobić?

komentarz 29 czerwca 2019 przez mbabane Szeryf (79,280 p.)

Jeśli Ci zależy na Javie to przyjelo sie ze pola w klasie deklaruje się tak:

public class AGD_COMPLEX {

   private String rok;
   private String kwartal;
   private String  miesiac;
     //pozostałe pola
//gettery i settery dalej
}

A także nazwy klas tzw. camel case:

class AgdComplex

 

1 odpowiedź

+1 głos
odpowiedź 29 czerwca 2019 przez Aisekai Nałogowiec (42,190 p.)

Deklaracje i inicjalizację listy, przenosisz przed pętlę while. Potem możesz streamem pogrupować mniej-więcej w taki sposób: 

public class Main{

    public static void main(String[] args){
        List<Foo> foos = new ArrayList<>();
        for(int i = 0; i < 100; ++i) foos.add(new Foo(i % 10, "" + i));
        Map<Integer, List<Foo>> collected= foos.stream().collect(Collectors.groupingBy(Foo::getNumber));
        collected.forEach((k,v)->{
            System.out.println(k + " " + v);
        });
    }

    static class Foo{

        int number;
        String value;

        public Foo(int number, String value){
            this.number = number;
            this.value = value;
        }

        public int getNumber(){
            return number;
        }

        public String toString(){
            return number + ": " + value;
        }
    }
}

Tutaj masz to lepiej pokazane, a także dla przypadku gdy grupujesz po kilku atrybutach. 

https://stackoverflow.com/questions/28342814/group-by-multiple-field-names-in-java-8

Następnie możesz wyciągnąć klucze z mapy za pomocą metody getKeySet() i policzyć średnią. 

Podobne pytania

0 głosów
0 odpowiedzi 234 wizyt
pytanie zadane 16 lutego 2022 w SQL, bazy danych przez Sebastian Szyja Bywalec (2,810 p.)
0 głosów
1 odpowiedź 342 wizyt
pytanie zadane 1 grudnia 2019 w SQL, bazy danych przez Mavannkas Bywalec (2,290 p.)
0 głosów
1 odpowiedź 125 wizyt
pytanie zadane 6 kwietnia 2021 w SQL, bazy danych przez yapyap Obywatel (1,730 p.)

92,572 zapytań

141,422 odpowiedzi

319,643 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...