Commit 23470d07 by Patryk Czarnik

grupowanie - wersje z pętlą

parent 8ee0969d
...@@ -27,7 +27,7 @@ public class Grupowanie0 { ...@@ -27,7 +27,7 @@ public class Grupowanie0 {
} }
} }
double srednia = suma / ile; double srednia = suma / ile;
System.out.println(job + " " + ile + " " + srednia); System.out.printf("%-32s| %2d | %8.2f%n", job, ile, srednia);
} }
} }
} }
...@@ -4,7 +4,8 @@ import java.io.FileNotFoundException; ...@@ -4,7 +4,8 @@ import java.io.FileNotFoundException;
import java.util.*; import java.util.*;
// Dla każdego joba obliczyć średnią pensję. // Dla każdego joba obliczyć średnią pensję.
// Klasyczny schemat grupowania za pomocą słowników.
// W tej wersji używamy wyłącznie podstawowych operacji dostepnych w tej formie od Java 5 (a w formie opartej o typ Object od Java 1.2).
public class Grupowanie1 { public class Grupowanie1 {
public static void main(String[] args) throws FileNotFoundException { public static void main(String[] args) throws FileNotFoundException {
List<Employee> emps = ObslugaCSV.readCSV(); List<Employee> emps = ObslugaCSV.readCSV();
...@@ -29,7 +30,7 @@ public class Grupowanie1 { ...@@ -29,7 +30,7 @@ public class Grupowanie1 {
int suma = sumy.get(job); int suma = sumy.get(job);
int ile = ilosci.get(job); int ile = ilosci.get(job);
double srednia = 1. * suma / ile; double srednia = 1. * suma / ile;
System.out.println(job + " " + ile + " " + srednia); System.out.printf("%-32s| %2d | %8.2f%n", job, ile, srednia);
} }
} }
} }
package emps.obiektowo;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
// Dla każdego joba obliczyć średnią pensję.
// Klasyczny schemat grupowania za pomocą słowników.
// W tej wersji używamy wyłącznie podstawowych operacji dostepnych w tej formie od Java 5 (a w formie opartej o typ Object od Java 1.2).
public class Grupowanie1a {
public static void main(String[] args) throws FileNotFoundException {
List<Employee> emps = ObslugaCSV.readCSV();
// dla każdego joba będziemy tu pamiętać sumę pensji
Map<String, Integer> sumy = new HashMap<>();
Map<String, Integer> ilosci = new HashMap<>();
for(Employee emp : emps) {
final String jobTitle = emp.getJobTitle();
if(sumy.containsKey(jobTitle)) {
sumy.put(jobTitle, sumy.get(jobTitle) + emp.getSalary());
ilosci.put(jobTitle, ilosci.get(jobTitle) + 1);
} else {
sumy.put(jobTitle, emp.getSalary());
ilosci.put(jobTitle, 1);
}
}
for(String job : sumy.keySet()) {
int suma = sumy.get(job);
int ile = ilosci.get(job);
double srednia = 1. * suma / ile;
System.out.printf("%-32s| %2d | %8.2f%n", job, ile, srednia);
}
}
}
package emps.obiektowo;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
// W tej werji używam dodatkowej operacji Java 8 - getOrDefault
public class Grupowanie2 {
public static void main(String[] args) throws FileNotFoundException {
List<Employee> emps = ObslugaCSV.readCSV();
Map<String, Integer> sumy = new HashMap<>();
Map<String, Integer> ilosci = new HashMap<>();
for(Employee emp : emps) {
int suma = sumy.getOrDefault(emp.getJobTitle(), 0);
sumy.put(emp.getJobTitle(), suma + emp.getSalary());
int ile = ilosci.getOrDefault(emp.getJobTitle(), 0);
ilosci.put(emp.getJobTitle(), ile + 1);
}
for(String job : sumy.keySet()) {
int suma = sumy.get(job);
int ile = ilosci.get(job);
double srednia = 1. * suma / ile;
System.out.printf("%-32s| %2d | %8.2f%n", job, ile, srednia);
}
}
}
package emps.obiektowo;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
// W tej werji używam dodatkowych operacji Java 8 - putIfAbsent / computeIfPresent (istnieje też ogólna operacja compute)
public class Grupowanie3 {
public static void main(String[] args) throws FileNotFoundException {
List<Employee> emps = ObslugaCSV.readCSV();
Map<String, Integer> sumy = new HashMap<>();
Map<String, Integer> ilosci = new HashMap<>();
for(Employee emp : emps) {
sumy.putIfAbsent(emp.getJobTitle(), 0);
ilosci.putIfAbsent(emp.getJobTitle(), 0);
sumy.computeIfPresent(emp.getJobTitle(), (k, suma) -> suma + emp.getSalary());
ilosci.computeIfPresent(emp.getJobTitle(), (k, v) -> v + 1);
}
for(String job : sumy.keySet()) {
int suma = sumy.get(job);
int ile = ilosci.get(job);
double srednia = 1. * suma / ile;
System.out.printf("%-32s| %2d | %8.2f%n", job, ile, srednia);
}
}
}
package emps.obiektowo;
import java.io.FileNotFoundException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
// W tej wersji używam dodatkowej operacji Java 8 - merge
// merge realizuje dokładnie ten schemat, o który chodzi nam w tym zadaniu:
// - jeśli wartości jeszcze nie ma → wstawia początkową
// - jeśli wartość już jest → aktualizuje zgodnie z podaną funkcją
public class Grupowanie4 {
public static void main(String[] args) throws FileNotFoundException {
List<Employee> emps = ObslugaCSV.readCSV();
Map<String, Integer> sumy = new HashMap<>();
Map<String, Integer> ilosci = new HashMap<>();
for(Employee emp : emps) {
// sumy.merge(emp.getJobTitle(), emp.getSalary(), (staraSuma, zmiana) -> staraSuma + zmiana);
// Zamiast pisać wyrażenie lambda, możemy użyć istniejącej funkcji Integer.sum
sumy.merge(emp.getJobTitle(), emp.getSalary(), Integer::sum);
ilosci.merge(emp.getJobTitle(), 1, Integer::sum);
}
for(String job : sumy.keySet()) {
int suma = sumy.get(job);
int ile = ilosci.get(job);
double srednia = 1. * suma / ile;
System.out.printf("%-32s| %2d | %8.2f%n", job, ile, srednia);
}
}
}
package emps.obiektowo;
import java.io.FileNotFoundException;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
public class Grupowanie5 {
public static void main(String[] args) throws FileNotFoundException {
List<Employee> emps = ObslugaCSV.readCSV();
Map<String, int[]> slownik = new TreeMap<>();
for(Employee emp : emps) {
if(slownik.containsKey(emp.getJobTitle())) {
// to jest kolejny pracownik z tego stanowiska → zwiększamy wartość w słowniku
int[] t = slownik.get(emp.getJobTitle());
t[0]++;
t[1] += emp.getSalary();
// dostaliśmy referencję do tablicy i gdy ją modyfikujemy, to słownik też to "widzi"
} else {
// to jest pierwszy pracownik z tego stanowiska → wpisujemy jego pensję jako wartość początkową
slownik.put(emp.getJobTitle(), new int[] {1, emp.getSalary()});
}
}
// przeglądamy "wpisy" w słowniku, czyli klucze wraz z wartościami
for (Map.Entry<String, int[]> entry : slownik.entrySet()) {
String job = entry.getKey();
int[] t = entry.getValue();
double srednia = (double)t[1] / t[0];
System.out.printf("%-32s | %2d | %8.2f\n", job, t[0], srednia);
}
}
}
package emps.obiektowo;
import java.io.FileNotFoundException;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
// Podejście obiektowe do grupowania.
public class Grupowanie6 {
public static void main(String[] args) throws FileNotFoundException {
final List<Employee> emps = ObslugaCSV.readCSV();
final Map<String, JobInfo> mapa = new TreeMap<>();
for (Employee emp : emps) {
final String jobTitle = emp.getJobTitle();
JobInfo jobInfo = mapa.get(jobTitle);
if (jobInfo == null) {
jobInfo = new JobInfo(jobTitle);
mapa.put(jobTitle, jobInfo);
}
jobInfo.update(emp);
}
for (JobInfo jobInfo : mapa.values()) {
System.out.println(jobInfo);
}
}
// Klasa zgnieżdżona - tylko dla przykładu.
// Równie dobrze mógłbym tę klase zdefiniować w osobnym pliku.
// Obiekt tej klasy przechowuje statystyki job
private static class JobInfo {
final String jobTitle;
int count = 0;
int sum = 0;
int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;
JobInfo(String jobTitle) {
this.jobTitle = jobTitle;
}
void update(Employee emp) {
int salary = emp.getSalary();
count++;
sum += salary;
if(salary < min) {
min = salary;
}
if(salary > max) {
max = salary;
}
}
double avg() {
return (double)sum / count;
}
@Override
public String toString() {
return "jobTitle=" + jobTitle + ", count=" + count + ", sum=" + sum + ", min=" + min + ", max="
+ max + ", avg=" + avg();
}
}
}
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