Commit 621396f6 by Patryk Czarnik

pozostałe przykłady sprzedaż

parent 892f922e
......@@ -2,6 +2,7 @@ package sprzedaz.strumieniowo;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.ArrayList;
......@@ -11,6 +12,7 @@ import java.util.Scanner;
// To jest przykład "klasy narzędziowej" / "utility class".
// Klasa zawiera różne operacje, jest takim zestawem metod.
public class ObslugaCSV {
private static final String SEP = ",";
private ObslugaCSV() {
// nie należy tworzyć obiektów tej klasy
......@@ -28,7 +30,7 @@ public class ObslugaCSV {
scanner.nextLine();
while(scanner.hasNextLine()) {
String linia = scanner.nextLine();
String[] t = linia.split(",");
String[] t = linia.split(SEP);
Transakcja transakcja = new Transakcja(LocalDate.parse(t[0]), t[1], t[2], t[3], t[4],
new BigDecimal(t[5]), Integer.parseInt(t[6]));
lista.add(transakcja);
......@@ -38,4 +40,32 @@ public class ObslugaCSV {
}
return lista;
}
public static void zapisz(List<Transakcja> transakcje, String sciezka) {
zapisz(transakcje, new File(sciezka));
}
public static void zapisz(List<Transakcja> transakcje, File plik) {
try(PrintWriter out = new PrintWriter(plik)) {
for(Transakcja tr : transakcje) {
out.print(tr.getData());
out.print(SEP);
out.print(tr.getMiasto());
out.print(SEP);
out.print(tr.getSklep());
out.print(SEP);
out.print(tr.getKategoria());
out.print(SEP);
out.print(tr.getTowar());
out.print(SEP);
out.print(tr.getCena());
out.print(SEP);
out.print(tr.getSztuk());
out.println();
}
} catch(FileNotFoundException e) {
e.printStackTrace();
}
}
}
package sprzedaz.strumieniowo;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class P4_Grupowanie_v1 {
public static void main(String[] args) {
List<Transakcja> transakcje = ObslugaCSV.wczytaj("sprzedaz.csv");
Map<String, List<Transakcja>> grupy = transakcje.stream()
.collect(Collectors.groupingBy(Transakcja::getMiasto));
// dla klucza, którym jest miasto, wartością jest lista transakcji z tego miasta
// zapiszmy transakcje z każdej grupy w oddzielnym pliku
grupy.forEach((miasto, lista) -> {
System.out.println("Zapisuję plik dla miasta " + miasto);
ObslugaCSV.zapisz(lista, "sprzedaz_" + miasto.toLowerCase() + ".csv");
});
}
}
package sprzedaz.strumieniowo;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class P4_Grupowanie_v2 {
public static void main(String[] args) {
List<Transakcja> transakcje = ObslugaCSV.wczytaj("sprzedaz.csv");
Map<String, Double> mapa = transakcje.stream()
.collect(Collectors.groupingBy(Transakcja::getMiasto,
Collectors.summingDouble(Transakcja::getWartoscDouble)));
mapa.forEach((miasto, suma) -> System.out.println(miasto + ": " + suma));
}
}
package sprzedaz.strumieniowo;
import java.util.DoubleSummaryStatistics;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
public class P4_Grupowanie_v3 {
public static void main(String[] args) {
List<Transakcja> transakcje = ObslugaCSV.wczytaj("sprzedaz.csv");
Map<String, DoubleSummaryStatistics> mapa = transakcje.stream()
.collect(Collectors.groupingBy(Transakcja::getMiasto,
Collectors.summarizingDouble(Transakcja::getWartoscDouble)));
// mapa.forEach((miasto, suma) -> System.out.println(miasto + ": " + suma));
mapa.forEach((miasto, stats) -> System.out.printf("| %-12s| %6d | %12.2f | %8.2f | %10.2f | %10.2f |\n",
miasto, stats.getCount(), stats.getSum(), stats.getMin(), stats.getAverage(), stats.getMax()));
}
}
package sprzedaz.wydajnosc;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.Locale;
// wersja specjalnie najwolniejsza
public class CzytajILicz1 {
static void calaRobota() {
try {
File plik = new File("sprzedaz_100.csv");
List<Transakcja> lista = WczytajSprzedaz1.wczytaj(plik);
Map<String, BigDecimal> sumy = lista.stream()
.collect(Collectors.groupingBy(Transakcja::getMiasto,
Collectors.mapping(Transakcja::getWartosc,
Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
sumy.forEach((k, v) -> System.out.printf(Locale.US, "%12s - %12.2f\n", k, v));
System.out.println();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Pomiary.zmierzCzasDzalania(CzytajILicz1::calaRobota);
Pomiary.wypiszPamiec();
System.out.println("gc...");
System.gc();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
Pomiary.wypiszPamiec();
}
}
package sprzedaz.wydajnosc;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.Locale;
/* W tej wersji dane są najpierw czytane do pamięci (ArrayList), a dopiero potem przetwarzane. */
public class CzytajILicz2 {
static void calaRobota() {
try {
File plik = new File("sprzedaz_100.csv");
List<Transakcja> lista = MaszynaWczytujaca.wczytajCalyPlik(plik);
Map<String, BigDecimal> sumy = lista.stream()
.collect(Collectors.groupingBy(Transakcja::getMiasto,
Collectors.mapping(Transakcja::getWartosc,
Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
sumy.forEach((k, v) -> System.out.printf(Locale.US, "%12s - %12.2f\n", k, v));
System.out.println();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Pomiary.zmierzCzasDzalania(CzytajILicz2::calaRobota);
Pomiary.wypiszPamiec();
System.out.println("gc...");
System.gc();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
Pomiary.wypiszPamiec();
}
}
package sprzedaz.wydajnosc;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.nio.file.Files;
import java.util.Locale;
import java.util.Map;
import java.util.stream.Collectors;
/* W tej wersji dane są czytane stumieniowo (Files.lines) i od razu przetwarzane. */
public class CzytajILicz3 {
static void calaRobota() {
try {
File plik = new File("sprzedaz_100.csv");
MaszynaWczytujaca maszynaWczytujaca = new MaszynaWczytujaca();
Map<String, BigDecimal> sumy = Files.lines(plik.toPath())
.map(maszynaWczytujaca::wczytajJedenRekord)
.collect(Collectors.groupingBy(Transakcja::getMiasto,
Collectors.mapping(Transakcja::getWartosc,
Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
sumy.forEach((k, v) -> System.out.printf(Locale.US, "%12s - %12.2f\n", k, v));
System.out.println();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Pomiary.zmierzCzasDzalania(CzytajILicz3::calaRobota);
Pomiary.wypiszPamiec();
System.out.println("gc...");
System.gc();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
Pomiary.wypiszPamiec();
}
}
package sprzedaz.wydajnosc;
import java.io.File;
import java.io.IOException;
import java.math.BigDecimal;
import java.nio.file.Files;
import java.util.Locale;
import java.util.Map;
import java.util.stream.Collectors;
/* W tej wersji dane są czytane stumieniowo (Files.lines) i od razu przetwarzane.
* Strumień zrównoleglony - działa szybciej!
*/
public class CzytajILicz4 {
static void calaRobota() {
try {
File plik = new File("sprzedaz_100.csv");
MaszynaWczytujaca maszynaWczytujaca = new MaszynaWczytujaca();
Map<String, BigDecimal> sumyDouble = Files.lines(plik.toPath())
.parallel()
.map(maszynaWczytujaca::wczytajJedenRekord)
.collect(Collectors.groupingBy(Transakcja::getMiasto,
Collectors.mapping(Transakcja::getWartosc,
Collectors.reducing(BigDecimal.ZERO, BigDecimal::add))));
sumyDouble.forEach((k, v) -> System.out.printf(Locale.US, "%12s - %12.2f\n", k, v));
System.out.println();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Pomiary.zmierzCzasDzalania(CzytajILicz4::calaRobota);
Pomiary.wypiszPamiec();
System.out.println("gc...");
System.gc();
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
}
Pomiary.wypiszPamiec();
}
}
package sprzedaz.wydajnosc;
import java.io.File;
import java.io.IOException;
import java.util.List;
public class F1_SredniaWartoscTransakcji {
public static void main(String[] args) {
try {
List<Transakcja> lista = MaszynaWczytujaca.wczytajCalyPlik(new File("rekordy.csv"));
System.out.println("Wczytano " + lista.size() + " rekordów");
double srednia = lista.stream()
.mapToDouble(Transakcja::getWartoscDouble)
.average()
.getAsDouble();
System.out.println(srednia);
} catch (IOException e) {
e.printStackTrace();
}
}
}
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