Commit 0829b6b4 by Patryk Czarnik

przykłady grupowania

parent 21758fe3
package emps.v2_obiektowo;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
/* W tej wersji:
złożoność obliczeniowa nie jest optymalna. Cała lista jest przeglądana wiele razy:
- raz, aby ustalić zbiór jobów,
- ponownie dla każdego joba.
Dla naszego pliku to jest (1+19) * 107 powtórzeń.
*/
public class Grupowanie_v1 {
public static void main(String[] args) {
List<Employee> emps = ObslugaCSV.wczytajDane();
// etap 1: utworzenie zbioru jobów (bez powtórzeń)
Set<String> jobs = new HashSet<>();
for(Employee emp : emps) {
jobs.add(emp.getJobTitle());
}
// System.out.println(jobs);
// etap 2: dla każdego z tych jobów liczymy (za pomocą pętli i ifa) średnią dla tego joba:
for(String job : jobs) {
double suma = 0;
int ile = 0;
for(Employee emp : emps) {
if(emp.getJobTitle().equals(job)) {
suma += emp.getSalary();
ile++;
}
}
double srednia = suma / ile;
System.out.printf("| %-32s | %2d | %8.2f |\n", job, ile, srednia);
}
}
}
package emps.v2_obiektowo;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/* Klasyczny algorytm grupowania w oparciu o słowniki.
* W tej wersji wykorzystujemy tylko operacje get, put, containsKey, które są dostępne od samego początku istnienia słowników Javie.
*/
public class Grupowanie_v2 {
public static void main(String[] args) {
List<Employee> emps = ObslugaCSV.wczytajDane();
Map<String, Integer> sumy = new HashMap<>();
Map<String, Integer> ilosci = new HashMap<>();
for(Employee emp : emps) {
// sprawdzamy, czy słownik już zawiera wpis dotyczący tego joba
if(sumy.containsKey(emp.getJobTitle())) {
// to jest kolejny pracownik z tego stanowiska → trzeba zwiększyć sumę
int suma = sumy.get(emp.getJobTitle());
sumy.put(emp.getJobTitle(), suma + emp.getSalary());
int ilosc = ilosci.get(emp.getJobTitle());
ilosci.put(emp.getJobTitle(), ilosc + 1);
} else {
// to jest pierwszy pracownik z tego stanowiska
sumy.put(emp.getJobTitle(), emp.getSalary());
ilosci.put(emp.getJobTitle(), 1);
}
}
// System.out.println(sumy);
// System.out.println(ilosci);
for(String job : sumy.keySet()) {
int suma = sumy.get(job);
int ilosc = ilosci.get(job);
double srednia = suma / ilosc;
System.out.printf("| %-32s | %2d | %8.2f |\n", job, ilosc, srednia);
}
}
}
package emps.v2_obiektowo;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/* Klasyczny algorytm grupowania w oparciu o słowniki.
* W tej wersji wykorzystujemy tylko operacje get, put, containsKey, które są dostępne od samego początku istnienia słowników Javie.
*/
public class Grupowanie_v2a {
public static void main(String[] args) {
final List<Employee> emps = ObslugaCSV.wczytajDane();
final Map<String, Integer> sumy = new HashMap<>();
final 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 ilosc = ilosci.get(job);
double srednia = suma / ilosc;
System.out.printf("| %-32s | %2d | %8.2f |\n", job, ilosc, srednia);
}
}
}
package emps.v2_obiektowo;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
/* W tej wersji używamy operacji getOrDefault (od Java 8) - dzięki temu można nie pisać ifa. */
public class Grupowanie_v3 {
public static void main(String[] args) {
List<Employee> emps = ObslugaCSV.wczytajDane();
Map<String, Integer> sumy = new TreeMap<>();
Map<String, Integer> ilosci = new TreeMap<>();
for(Employee emp : emps) {
int suma = sumy.getOrDefault(emp.getJobTitle(), 0);
sumy.put(emp.getJobTitle(), suma + emp.getSalary());
int ilosc = ilosci.getOrDefault(emp.getJobTitle(), 0);
ilosci.put(emp.getJobTitle(), ilosc + 1);
}
for(String job : sumy.keySet()) {
int suma = sumy.get(job);
int ilosc = ilosci.get(job);
double srednia = suma / ilosc;
System.out.printf("| %-32s | %2d | %8.2f |\n", job, ilosc, srednia);
}
}
}
package emps.v2_obiektowo;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/* Tu wykorzystamy operacje putIfAbsent / computeIfPresent (od Java 8) */
public class Grupowanie_v4 {
public static void main(String[] args) {
List<Employee> emps = ObslugaCSV.wczytajDane();
Map<String, Integer> sumy = new HashMap<>();
Map<String, Integer> ilosci = new HashMap<>();
for(Employee emp : emps) {
// Gdyby jeszcze nie było wartości pod tym kluczem, wpisujemy zera
sumy.putIfAbsent(emp.getJobTitle(), 0);
ilosci.putIfAbsent(emp.getJobTitle(), 0);
// Za pomocą wyrażeń lambda określamy, w jaki sposób mają zostać zmienione wartośc.
// Funkcja modyfikująca jako argumenty przyjmuje klucz oraz poprzednią wartość ze słownika, a w wyniku ma dać nową wartość
sumy.computeIfPresent(emp.getJobTitle(), (job, suma) -> suma + emp.getSalary());
ilosci.computeIfPresent(emp.getJobTitle(), (job, ilosc) -> ilosc+1);
}
for(String job : sumy.keySet()) {
int suma = sumy.get(job);
int ilosc = ilosci.get(job);
double srednia = suma / ilosc;
System.out.printf("| %-32s | %2d | %8.2f |\n", job, ilosc, srednia);
}
}
}
package emps.v2_obiektowo;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/* Tu wykorzystamy operację merge (od Java 8)
*
* Operacja merge idealnie pasuje do schematu, który realizujemy w tym zadaniu.
* slownik.merge(KLUCZ, WARTOSC, FUNKCJA)
* - jeśli w słowniku nie ma jeszcze KLUCZa, to pod KLUCZ wpisywana jest WARTOSC
* - jeśli w słowniku pod KLUCZ jest STARA_WARTOSC, to wykorzystywana jest FUNKCJA w taki sposób:
* NOWA_WARTOSC = FUNKCJA(STARA_WARTOSC, WARTOSC)
* a następne NOWA_WARTOSC wpisywana jest do słownika pod KLUCZ
*/
public class Grupowanie_v5 {
public static void main(String[] args) {
List<Employee> emps = ObslugaCSV.wczytajDane();
Map<String, Integer> sumy = new HashMap<>();
Map<String, Integer> ilosci = new HashMap<>();
for(Employee emp : emps) {
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 ilosc = ilosci.get(job);
double srednia = suma / ilosc;
System.out.printf("| %-32s | %2d | %8.2f |\n", job, ilosc, srednia);
}
}
}
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