Commit afae35c1 by Patryk Czarnik

grupowanie employeesów

parent 990f77a9
package przyklady.emps.obiektowo;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import przyklady.emps.Employee;
import przyklady.emps.ObslugaCSV;
public class Grupowanie1 {
// Ta wersja nie jest optymalnie wydajna, dla 107 pracowników i 19 stanowisk
// pracowników przeglądamy 20 * 107 razy.
public static void main(String[] args) {
List<Employee> employees = ObslugaCSV.wczytaj("pracownicy.csv");
// etap 1: ustalenie jakie są stanowiska (jobs) wśród pracowników
Set<String> jobs = new HashSet<>();
for (Employee emp : employees) {
jobs.add(emp.getJobTitle());
}
System.out.println("Zebrane nazwy stanowisk (" + jobs.size() + "):");
System.out.println(jobs);
System.out.println();
// etap 2: dla każdego stanowiska wyliczenie średniej
for (String job : jobs) {
double suma = 0;
int ilosc = 0;
for (Employee emp : employees) {
if (Objects.equals(emp.getJobTitle(), job)) {
suma += emp.getSalary();
ilosc++;
}
}
double srednia = suma / ilosc;
System.out.printf("| %32s | %2d | %8.2f |\n", job, ilosc, srednia);
}
}
}
package przyklady.emps.obiektowo;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import przyklady.emps.Employee;
import przyklady.emps.ObslugaCSV;
public class Grupowanie1_poprawione {
public static void main(String[] args) {
List<Employee> employees = ObslugaCSV.wczytaj("pracownicy.csv");
Set<String> jobs = zbierzNazwyStanowisk(employees);
System.out.println("Zebrane nazwy stanowisk (" + jobs.size() + "):");
System.out.println(jobs);
System.out.println();
for (String job : jobs) {
obliczDlaStanowiska(employees, job);
}
}
private static Set<String> zbierzNazwyStanowisk(List<Employee> employees) {
Set<String> jobs = new HashSet<>();
for (Employee emp : employees) {
jobs.add(emp.getJobTitle());
}
return jobs;
}
private static void obliczDlaStanowiska(List<Employee> employees, String job) {
double suma = 0;
int ilosc = 0;
for (Employee emp : employees) {
if (Objects.equals(emp.getJobTitle(), job)) {
suma += emp.getSalary();
ilosc++;
}
}
double srednia = suma / ilosc;
System.out.printf("| %32s | %2d | %8.2f |\n", job, ilosc, srednia);
}
}
package przyklady.emps.obiektowo;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import przyklady.emps.Employee;
import przyklady.emps.ObslugaCSV;
// Klasyczny schemat grupowania za pomocą słowników.
// Używam wyłącznie starych operacji słownikowych dostępnych od Javy 5.
public class Grupowanie2 {
public static void main(String[] args) {
List<Employee> employees = ObslugaCSV.wczytaj("pracownicy.csv");
Map<String, Double> sumy = new HashMap<>();
Map<String, Integer> ilosci = new HashMap<>();
for (Employee emp : employees) {
String jobTitle = emp.getJobTitle();
if(sumy.containsKey(jobTitle)) {
double sumaDoTejPory = sumy.get(jobTitle);
sumy.put(jobTitle, sumaDoTejPory + emp.getSalary());
int iloscDoTejPory = ilosci.get(jobTitle);
ilosci.put(jobTitle, iloscDoTejPory + 1);
} else {
sumy.put(jobTitle, (double)emp.getSalary());
ilosci.put(jobTitle, 1);
}
}
for (String job : sumy.keySet()) {
double 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 przyklady.emps.obiektowo;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import przyklady.emps.Employee;
import przyklady.emps.ObslugaCSV;
// W tej wersji używamy nowej operacji od Java 8: getOrDefault. Dzięki temu nie piszemy if-a
public class Grupowanie3 {
public static void main(String[] args) {
List<Employee> employees = ObslugaCSV.wczytaj("pracownicy.csv");
Map<String, Double> sumy = new TreeMap<>();
Map<String, Integer> ilosci = new TreeMap<>();
for (Employee emp : employees) {
String jobTitle = emp.getJobTitle();
double sumaDoTejPory = sumy.getOrDefault(jobTitle, 0.0);
sumy.put(jobTitle, sumaDoTejPory + emp.getSalary());
int iloscDoTejPory = ilosci.getOrDefault(jobTitle, 0);
ilosci.put(jobTitle, iloscDoTejPory + 1);
}
for (String job : sumy.keySet()) {
double 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 przyklady.emps.obiektowo;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import przyklady.emps.Employee;
import przyklady.emps.ObslugaCSV;
// W tej wersji używamy nowej operacji od Java 8: putIfAbsent. Dzięki temu nie piszemy if-a
// Przy okazji: zamiast pary operacji get / put używamy nowej operacji compute(IfPresent)
public class Grupowanie4 {
public static void main(String[] args) {
List<Employee> employees = ObslugaCSV.wczytaj("pracownicy.csv");
Map<String, Double> sumy = new TreeMap<>();
Map<String, Integer> ilosci = new TreeMap<>();
for (Employee emp : employees) {
String jobTitle = emp.getJobTitle();
sumy.putIfAbsent(jobTitle, 0.0);
ilosci.putIfAbsent(jobTitle, 0);
sumy.computeIfPresent(jobTitle, (klucz, wartosc) -> wartosc + emp.getSalary());
ilosci.computeIfPresent(jobTitle, (klucz, wartosc) -> wartosc + 1);
}
for (String job : sumy.keySet()) {
double suma = sumy.get(job);
int ilosc = ilosci.get(job);
double srednia = suma / ilosc;
System.out.printf("| %32s | %2d | %8.2f |\n", job, ilosc, srednia);
}
}
}
/* tłumaczenie jak działa compute:
{
int wartosc = sumy.get(jobTitle);
sumy.put(jobTitle, wartosc + emp.getSalary());
}
sumy.computeIfPresent(jobTitle, (klucz, wartosc) -> wartosc + emp.getSalary());
*/
package przyklady.emps.obiektowo;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import przyklady.emps.Employee;
import przyklady.emps.ObslugaCSV;
// W tej wersji używamy nowej operacji od Java 8: merge. Ona robi dokładnie to, o co chodzi w tym zadaniu :)
public class Grupowanie5 {
public static void main(String[] args) {
List<Employee> employees = ObslugaCSV.wczytaj("pracownicy.csv");
Map<String, Double> sumy = new TreeMap<>();
Map<String, Integer> ilosci = new TreeMap<>();
for (Employee emp : employees) {
sumy.merge(emp.getJobTitle(), (double)emp.getSalary(), Double::sum);
ilosci.merge(emp.getJobTitle(), 1, Integer::sum);
}
for (String job : sumy.keySet()) {
double 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 przyklady.emps.obiektowo;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import przyklady.emps.Employee;
import przyklady.emps.ObslugaCSV;
// W tej wersji używamy nowej operacji od Java 8: merge. Ona robi dokładnie to, o co chodzi w tym zadaniu :)
public class Grupowanie5a {
public static void main(String[] args) {
List<Employee> employees = ObslugaCSV.wczytaj("pracownicy.csv");
Map<String, Double> sumy = new TreeMap<>();
Map<String, Integer> ilosci = new TreeMap<>();
for (Employee emp : employees) {
ilosci.merge(emp.getJobTitle(), 1, (x,y) -> x+y);
sumy.merge(emp.getJobTitle(), (double)emp.getSalary(), (staraWartosc, zmiana) -> staraWartosc + zmiana);
// merge:
// 1) jeśli danego klucza jeszcze nie ma, wstawia podaną wartość, tutaj salary
// 2) jeśli taki klucz już jest, to podana funkcja jest wywoływana dla argumentów:
// ("stara wartość ze słownika", "wartość podana tutaj", czyli salary.
// wynik tej funkcji jest wstawiany do mapy jako nowa wartość
}
for (String job : sumy.keySet()) {
double 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 przyklady.emps.obiektowo;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
import przyklady.emps.Employee;
import przyklady.emps.ObslugaCSV;
public class Grupowanie6 {
public static void main(String[] args) {
final List<Employee> employees = ObslugaCSV.wczytaj("pracownicy.csv");
final Map<String, int[]> mapa = new TreeMap<>();
for (Employee emp : employees) {
final String jobTitle = emp.getJobTitle();
if(mapa.containsKey(jobTitle)) {
int[] wpis = mapa.get(jobTitle);
wpis[0] += 1;
wpis[1] += emp.getSalary();
// nie trzeba robić put
} else {
mapa.put(jobTitle, new int[] {1, (int)emp.getSalary()});
}
}
for(Entry<String, int[]> entry : mapa.entrySet()) {
String job = entry.getKey();
int ilosc = entry.getValue()[0];
int suma = entry.getValue()[1];
double srednia = 1.0 * suma / ilosc;
System.out.printf("%-32s | %2d | %8.2f%n", job, ilosc, srednia);
}
}
}
package przyklady.emps.obiektowo;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import przyklady.emps.Employee;
import przyklady.emps.ObslugaCSV;
public class Grupowanie7 {
public static void main(String[] args) {
final List<Employee> employees = ObslugaCSV.wczytaj("pracownicy.csv");
final Map<String, JobInfo> mapa = new TreeMap<>();
for (Employee emp : employees) {
final String jobTitle = emp.getJobTitle();
if(mapa.containsKey(jobTitle)) {
JobInfo jobInfo = mapa.get(jobTitle);
jobInfo.aktualizuj(emp);
} else {
JobInfo jobInfo = JobInfo.dlaPierwszegoPracownika(emp);
mapa.put(jobTitle, jobInfo);
}
}
for(JobInfo jobInfo : mapa.values()) {
System.out.printf("%-32s | %2d | %8.2f%n",
jobInfo.getJob(), jobInfo.getIlosc(), jobInfo.getSrednia());
}
}
}
package przyklady.emps.obiektowo;
import przyklady.emps.Employee;
public class JobInfo {
private final String job;
private int ilosc;
private double suma;
private JobInfo(String job, int ilosc, double suma) {
this.job = job;
this.ilosc = ilosc;
this.suma = suma;
}
public static JobInfo puste(String jobTitle) {
return new JobInfo(jobTitle, 0, 0);
}
public static JobInfo dlaPierwszegoPracownika(Employee emp) {
return new JobInfo(emp.getJobTitle(), 1, emp.getSalary());
}
public void aktualizuj(Employee emp) {
this.ilosc++;
this.suma += emp.getSalary();
}
public String getJob() {
return job;
}
public int getIlosc() {
return ilosc;
}
public double getSuma() {
return suma;
}
public double getSrednia() {
return suma / ilosc;
}
}
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