Commit dfe90ee5 by Patryk Czarnik

Przykłady dla większego pliku i czytanie strumieniem prosto z pliku

parent 61259230
...@@ -6,3 +6,5 @@ ...@@ -6,3 +6,5 @@
/*.iml /*.iml
/.idea/ /.idea/
/emps_big.csv
package emps;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
public class PrzygotujDuzyPlik {
public static void main(String[] args) {
final String zrodlo = "emps.csv";
final String cel = "emps_big.csv";
final int N = 100_000;
try(PrintWriter out = new PrintWriter(cel)) {
for(int i = 0; i < N; i++) {
System.out.print(i + " ");
try(BufferedReader in = new BufferedReader(new FileReader(zrodlo))) {
String pierwszaLinia = in.readLine();
if(i == 0) {
out.println(pierwszaLinia);
}
String linia;
while((linia = in.readLine()) != null) {
out.println(linia);
}
}
}
System.out.println();
System.out.println("Gotowe");
} catch (IOException e) {
e.printStackTrace();
}
}
}
package emps.strumieniowo;
public class F1_WypiszZeStrumienia {
public static void main(String[] args) {
ObslugaCSV.wczytajStrumien("emps.csv")
.forEachOrdered(emp -> System.out.println(emp.getFirstName() + " " + emp.getLastName()));
}
}
package emps.strumieniowo;
import java.util.OptionalDouble;
import javax.swing.JOptionPane;
public class F4_SredniaJob {
public static void main(String[] args) {
String job = JOptionPane.showInputDialog("Podaj nazwę stanowiska, np. Programmer");
// spróbuj emps_big po wygenerowaniu pliku u siebie
OptionalDouble srednia = ObslugaCSV.wczytajStrumien("emps.csv")
.filter(emp -> emp.getJobTitle().equalsIgnoreCase(job))
.mapToInt(Employee::getSalary)
.average();
if(srednia.isPresent()) {
JOptionPane.showMessageDialog(null, "Średnia programistów: " + srednia.getAsDouble());
} else {
JOptionPane.showMessageDialog(null, "Nie ma żadnego pracownika na stanowisku " + job, "Brak danych", JOptionPane.WARNING_MESSAGE);
}
}
}
package emps.strumieniowo;
import java.util.Map;
import java.util.stream.Collectors;
public class Grupowanie2_CzystoStrumieniowo {
public static void main(String[] args) {
Map<String, Double> srednie = ObslugaCSV.wczytajStrumien("emps.csv")
.collect(Collectors.groupingBy(Employee::getJobTitle,
Collectors.averagingInt(Employee::getSalary)));
srednie.forEach((job, avg) -> System.out.printf("%32s → %8.2f\n", job, avg));
}
}
...@@ -2,11 +2,16 @@ package emps.strumieniowo; ...@@ -2,11 +2,16 @@ package emps.strumieniowo;
import java.io.File; import java.io.File;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter; import java.io.PrintWriter;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDate; import java.time.LocalDate;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Scanner; import java.util.Scanner;
import java.util.stream.Stream;
public class ObslugaCSV { public class ObslugaCSV {
private static final String NAGLOWEK = "employee_id;first_name;last_name;job_title;salary;hire_date;department_name;address;postal_code;city;country"; private static final String NAGLOWEK = "employee_id;first_name;last_name;job_title;salary;hire_date;department_name;address;postal_code;city;country";
...@@ -23,10 +28,7 @@ public class ObslugaCSV { ...@@ -23,10 +28,7 @@ public class ObslugaCSV {
while(scanner.hasNextLine()) { while(scanner.hasNextLine()) {
String linia = scanner.nextLine(); String linia = scanner.nextLine();
String[] t = linia.split(SEP, 11); Employee emp = wczytajWiersz(linia);
Employee emp = new Employee(Integer.parseInt(t[0]), t[1], t[2], t[3],
Integer.parseInt(t[4]), LocalDate.parse(t[5]), t[6], t[7], t[8], t[9], t[10]);
emps.add(emp); emps.add(emp);
} }
} catch (FileNotFoundException e) { } catch (FileNotFoundException e) {
...@@ -40,6 +42,36 @@ public class ObslugaCSV { ...@@ -40,6 +42,36 @@ public class ObslugaCSV {
return wczytaj(new File(sciezka)); return wczytaj(new File(sciezka));
} }
public static Stream<Employee> wczytajStrumien(Path path) {
// Ta metoda zwraca w wyniku "otwarty strumień", z którego będzie można pobierać kolejne obiekty Employee.
// Dzięki takiemu podejściu dane wszystkich pracowników nie muszą być wczytywane na raz do pamięci (jak w przypadku listy),
// tylko mogą być przetwarzane jedne po drugim.
try {
return Files.lines(path)
.skip(1)
//.parallel()
.map(ObslugaCSV::wczytajWiersz);
} catch (IOException e) {
e.printStackTrace();
return Stream.empty();
}
}
public static Stream<Employee> wczytajStrumien(String sciezka) {
return wczytajStrumien(Paths.get(sciezka));
}
public static Stream<Employee> wczytajStrumien(File plik) {
return wczytajStrumien(plik.toPath());
}
private static Employee wczytajWiersz(String linia) {
String[] t = linia.split(SEP, 11);
return new Employee(Integer.parseInt(t[0]), t[1], t[2], t[3],
Integer.parseInt(t[4]), LocalDate.parse(t[5]), t[6], t[7], t[8], t[9], t[10]);
}
public static void zapisz(List<Employee> lista, File plik) { public static void zapisz(List<Employee> lista, File plik) {
try(PrintWriter out = new PrintWriter(plik)) { try(PrintWriter out = new PrintWriter(plik)) {
out.println(NAGLOWEK); out.println(NAGLOWEK);
......
...@@ -10,7 +10,7 @@ public class P2_FiltrowanieDoListyString { ...@@ -10,7 +10,7 @@ public class P2_FiltrowanieDoListyString {
List<String> wyniki = emps.stream() List<String> wyniki = emps.stream()
.filter(emp -> emp.getSalary() >= 10_000) .filter(emp -> emp.getSalary() >= 10_000)
.map(emp -> String.format("Pracownik %s %s (%s) zarabia %.2f USD", .map(emp -> String.format("Pracownik %s %s (%s) zarabia %d USD",
emp.getFirstName(), emp.getLastName(), emp.getJobTitle(), emp.getSalary())) emp.getFirstName(), emp.getLastName(), emp.getJobTitle(), emp.getSalary()))
.collect(Collectors.toList()); .collect(Collectors.toList());
......
...@@ -8,10 +8,10 @@ import javax.swing.JOptionPane; ...@@ -8,10 +8,10 @@ import javax.swing.JOptionPane;
public class P4_SredniaJob_v2 { public class P4_SredniaJob_v2 {
public static void main(String[] args) { public static void main(String[] args) {
List<Employee> emps = ObslugaCSV.wczytaj("emps.csv");
String job = JOptionPane.showInputDialog("Podaj nazwę stanowiska, np. Programmer"); String job = JOptionPane.showInputDialog("Podaj nazwę stanowiska, np. Programmer");
List<Employee> emps = ObslugaCSV.wczytaj("emps.csv");
OptionalDouble srednia = emps.stream() OptionalDouble srednia = emps.stream()
.filter(emp -> emp.getJobTitle().equalsIgnoreCase(job)) .filter(emp -> emp.getJobTitle().equalsIgnoreCase(job))
.mapToInt(Employee::getSalary) .mapToInt(Employee::getSalary)
......
package emps.strumieniowo; package emps.strumieniowo;
import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.TreeSet;
import java.util.stream.Collectors;
public class P6_UnikalneMiasta_Set { public class P6_UnikalneMiasta_Set {
public static void main(String[] args) { public static void main(String[] args) {
List<Employee> emps = ObslugaCSV.wczytaj("emps.csv"); List<Employee> emps = ObslugaCSV.wczytaj("emps.csv");
emps.stream() Collection<String> miasta = emps.stream()
.map(Employee::getCity) .map(Employee::getCity)
.distinct() .collect(Collectors.toSet());
.forEach(System.out::println);
// .collect(Collectors.toList());
// .collect(Collectors.toCollection(TreeSet::new));
System.out.println("Miasta: " + miasta);
System.out.println("Typ kolekcji: " + miasta.getClass().getName());
} }
} }
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