Commit 7d5f8c75 by Patryk Czarnik

record

parent 75708a8f
package sprzedaz_rekordy;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
public class Grupowanie2 {
public static void main(String[] args) {
List<Rekord> lista = ObslugaCSV.wczytaj("sprzedaz.csv");
Map<String, BigDecimal> slownik = new TreeMap<>();
for(Rekord rekord : lista) {
// Próbujemy oczytać wartość spod klucza, ale gdyby nie było, to pobierami domyślne ZERO
BigDecimal suma = slownik.getOrDefault(rekord.miasto(), BigDecimal.ZERO);
slownik.put(rekord.miasto(), suma.add(rekord.getWartosc()));
}
for(Map.Entry<String, BigDecimal> entry : slownik.entrySet()) {
System.out.printf("%-10s → %12s%n", entry.getKey(), entry.getValue());
}
}
}
package sprzedaz_rekordy;
import java.util.DoubleSummaryStatistics;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Grupowanie7 {
public static void main(String[] args) {
List<Rekord> lista = ObslugaCSV.wczytaj("sprzedaz.csv");
Map<String, DoubleSummaryStatistics> srednie = lista.stream()
.collect(Collectors.groupingBy(Rekord::miasto,
Collectors.summarizingDouble(Rekord::getWartoscDouble)));
srednie.forEach((miasto, stats) -> System.out.printf("| %-32s | %2d | %8.2f | %8.2f | %8.2f | %12.2f |%n",
miasto, stats.getCount(), stats.getMin(), stats.getAverage(), stats.getMax(), stats.getSum()));
}
}
package sprzedaz_rekordy;
import java.io.File;
import java.io.FileNotFoundException;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class ObslugaCSV {
public static List<Rekord> wczytaj(String sciezka) {
return wczytaj(new File(sciezka));
}
public static List<Rekord> wczytaj(File plik) {
List<Rekord> lista = new ArrayList<>();
try(Scanner scanner = new Scanner(plik)) {
scanner.nextLine();
while(scanner.hasNextLine()) {
String linia = scanner.nextLine();
String[] t = linia.split(",", -1);
Rekord rekord = new Rekord(LocalDate.parse(t[0]), t[1], t[2], t[3], t[4],
new BigDecimal(t[5]), Integer.parseInt(t[6]));
lista.add(rekord);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return lista;
}
}
package sprzedaz_rekordy;
import java.util.List;
public class P1_SumaSztuk {
public static void main(String[] args) {
List<Rekord> lista = ObslugaCSV.wczytaj("sprzedaz.csv");
// oblicz sumę wartości w polu "sztuk"
// styl "imperatywny"
int suma = 0;
for(Rekord rekord : lista) {
suma += rekord.sztuk();
}
System.out.println(suma);
// styl "funkcyjny"
int suma2 = lista.stream().mapToInt(Rekord::sztuk).sum();
System.out.println(suma2);
}
}
package sprzedaz_rekordy;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.List;
public class P2_SredniaWartosc {
public static void main(String[] args) {
List<Rekord> lista = ObslugaCSV.wczytaj("sprzedaz.csv");
// oblicz średnią wartość transakcji
// styl "imperatywny"
// gdybyśmy mieli tylko metodę zwracającą cenę jako BigDecimal i chcieli liczcyć na BigDecimalach:
BigDecimal suma = BigDecimal.ZERO;
for(Rekord rekord : lista) {
// add działa jak + a nie jak +=
suma = suma.add(rekord.cena().multiply(BigDecimal.valueOf(rekord.sztuk())));
}
System.out.println("suma: " + suma);
BigDecimal sredniaBD = suma.divide(BigDecimal.valueOf(lista.size()), 2, RoundingMode.HALF_EVEN);
System.out.println("średnia BD: " + sredniaBD);
// Do klasy Rekord można dodać metody, które "wyglądają jak gettery",
// ale obliczają swoje wyniki na podstawie innych pól obiektu.
// Ma to sens, jeśli danej operacji potrzebujemy często, w różnych miejscach kodu.
double sumaDouble = 0.0;
for(Rekord rekord : lista) {
sumaDouble += rekord.getWartoscDouble();
}
double sredniaDouble = sumaDouble / lista.size();
System.out.println("średnia D: " + sredniaDouble);
// wersja funkcyjna:
double sredniaStream = lista.stream().mapToDouble(Rekord::getWartoscDouble).average().orElse(0.0);
System.out.println("średnia S: " + sredniaStream);
double sredniaPStream = lista.parallelStream().mapToDouble(Rekord::getWartoscDouble).average().orElse(0.0);
System.out.println("średnia P: " + sredniaPStream);
}
}
package sprzedaz_rekordy;
import java.math.BigDecimal;
import java.time.LocalDate;
public record Rekord(LocalDate data, String miasto, String sklep, String kategoria, String towar, BigDecimal cena, int sztuk) {
public BigDecimal getWartosc() {
return cena.multiply(BigDecimal.valueOf(sztuk));
}
public double getWartoscDouble() {
return cena.doubleValue() * sztuk;
}
}
package sprzedaz_rekordy;
import java.util.List;
public class TestOdczytu {
public static void main(String[] args) {
List<Rekord> lista = ObslugaCSV.wczytaj("sprzedaz.csv");
System.out.println("Wczytano " + lista.size() + " rekordów.");
for (Rekord rekord : lista) {
System.out.println(rekord);
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment