Commit 2df47500 by Patryk Czarnik

Przykłady grupowania

parent 373af7f0
package sprzedaz;
import java.math.BigDecimal;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
// Celem programów z tej serii jest obliczenie sumy sprzedaży w każdym mieści, jakie występuje w pliku.
// Odpowiada to operacji GROUP BY z języka SQL.
// W tej wersji rozwiązanie nie jest optymalne zwn wydajność.
// Wielokrotnie przeglądam dane źródłowe: raz, aby ustalić, jakie są miasta, a później dla każdego miasta, aby przefiltrować i zsumować.
public class Grupowanie0 {
public static void main(String[] args) {
List<Rekord> lista = ObslugaCSV.wczytaj("sprzedaz.csv");
// etap 1: przeglądają całą listę zbieramy informacje o tym, jakie występują miasta
Set<String> miasta = new TreeSet<>();
for(Rekord rekord : lista) {
miasta.add(rekord.getMiasto());
}
System.out.println("Miasta: " + miasta);
// etap 2:
for(String miasto : miasta) {
BigDecimal suma = BigDecimal.ZERO;
for(Rekord rekord : lista) {
if(rekord.getMiasto().equals(miasto)) {
suma = suma.add(rekord.getWartosc());
}
}
System.out.printf("%-10s → %12s%n", miasto, suma);
}
}
}
package sprzedaz;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
// Klasyczny algorytm grupowania z wykorzystaniem słowników.
// Używamy tylko operacji dostępnych w Javie 5-7.
public class Grupowanie1 {
public static void main(String[] args) {
List<Rekord> lista = ObslugaCSV.wczytaj("sprzedaz.csv");
// W słowniku dla danego miasta pamiętamy sumę wartości.
// Słownik jest uzupełniany w trakcie czytania listy.
Map<String, BigDecimal> slownik = new TreeMap<String, BigDecimal>();
for(Rekord rekord : lista) {
String miasto = rekord.getMiasto();
if(slownik.containsKey(miasto)) {
// to jest kolejny rekord z miasta, które ju było → zwiększamy sumę
BigDecimal suma = slownik.get(miasto);
slownik.put(miasto, suma.add(rekord.getWartosc()));
} else {
// to jest pierwszy rekord z danego miasta → dodaję pierwszy wpis
slownik.put(miasto, rekord.getWartosc());
}
}
// System.out.println(slownik);
// Przejrzenie zawartości słownika - kluczy wraz z wartościami
// Wersja dla Javy < 8 oparta o entrySet. Entry to jest para klucz→wartość
for(Map.Entry<String, BigDecimal> entry : slownik.entrySet()) {
System.out.printf("%-10s → %12s%n", entry.getKey(), entry.getValue());
}
}
}
package sprzedaz;
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.getMiasto(), BigDecimal.ZERO);
slownik.put(rekord.getMiasto(), suma.add(rekord.getWartosc()));
}
for(Map.Entry<String, BigDecimal> entry : slownik.entrySet()) {
System.out.printf("%-10s → %12s%n", entry.getKey(), entry.getValue());
}
}
}
package sprzedaz;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
public class Grupowanie3 {
public static void main(String[] args) {
List<Rekord> lista = ObslugaCSV.wczytaj("sprzedaz.csv");
Map<String, BigDecimal> slownik = new TreeMap<>();
for(Rekord rekord : lista) {
slownik.merge(rekord.getMiasto(), rekord.getWartosc(), BigDecimal::add);
}
for(Map.Entry<String, BigDecimal> entry : slownik.entrySet()) {
System.out.printf("%-10s → %12s%n", entry.getKey(), entry.getValue());
}
}
}
package sprzedaz;
import java.io.IOException;
import java.math.BigDecimal;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.nio.file.StandardOpenOption;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.stream.Collectors;
public class Grupowanie4 {
public static void main(String[] args) {
List<Rekord> lista = ObslugaCSV.wczytaj("sprzedaz.csv");
// Tutaj stosujemy Collectors.groupingBy w najprosztszej wersji - grupowanie rekordów.
// Powstaje słownik, gdzie dla określonego klucza (np. miasta Katowice)
// wartością jest lista tych rekordów, które należą do tej grupy.
Map<String, List<Rekord>> grupy = lista.stream().collect(Collectors.groupingBy(Rekord::getMiasto));
System.out.println("Liczba grup: " + grupy.size());
System.out.println("Klucze: " + grupy.keySet());
// Tutaj dla każdego miasta zapiszemy sobie plik z transakcjami z tego miasta
// Przeglądanie danych też zapiszemy "funkcyjnie" - od Javy 8 można tak:
grupy.forEach((miasto, rekordy) -> {
System.out.println("W mieście " + miasto + " było " + rekordy.size() + " transakcji");
List<String> lines = rekordy.stream().map(Rekord::toString).collect(Collectors.toList());
try {
Files.write(Paths.get("rekordy_" + miasto + ".txt"), lines, StandardOpenOption.CREATE);
} catch (IOException e) {
System.err.println(e);
}
});
System.out.println("Gotowe");
}
}
package sprzedaz;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import static java.util.stream.Collectors.*;
public class Grupowanie5 {
public static void main(String[] args) {
List<Rekord> lista = ObslugaCSV.wczytaj("sprzedaz.csv");
Map<String, BigDecimal> sumy = lista.stream()
.collect(groupingBy(Rekord::getMiasto,
mapping(Rekord::getWartosc,
reducing(BigDecimal.ZERO, BigDecimal::add))));
sumy.forEach((miasto, srednia) -> System.out.printf("%-10s → %12s%n", miasto, srednia));
}
}
package sprzedaz;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class Grupowanie6 {
public static void main(String[] args) {
List<Rekord> lista = ObslugaCSV.wczytaj("sprzedaz.csv");
Map<String, Double> srednie = lista.stream()
.collect(Collectors.groupingBy(Rekord::getMiasto,
Collectors.averagingDouble(Rekord::getWartoscDouble)));
srednie.forEach((miasto, srednia) -> System.out.printf("%-10s → %8.2f%n", miasto, srednia));
}
}
package sprzedaz;
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::getMiasto,
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;
import java.math.BigDecimal;
import java.util.List;
import javax.swing.JOptionPane;
public class P3_SumaWMiescie {
public static void main(String[] args) {
List<Rekord> lista = ObslugaCSV.wczytaj("sprzedaz.csv");
String miasto = JOptionPane.showInputDialog("Podaj miasto");
// getMiasto nie zwraca nigdy null
// wersja double:
double suma1 = lista.stream()
.filter(r -> r.getMiasto().equalsIgnoreCase(miasto))
.mapToDouble(Rekord::getWartoscDouble)
.sum();
// wersja BigDecimal:
BigDecimal suma2 = lista.stream()
.filter(r -> r.getMiasto().equalsIgnoreCase(miasto))
.map(Rekord::getWartosc)
.reduce(BigDecimal.ZERO, BigDecimal::add);
JOptionPane.showMessageDialog(null, "Suma double: " + suma1 + "\nSuma BigDecimal: " + suma2);
}
}
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