Commit 38219ed7 by Patryk Czarnik

dodatkowe wersje grupowania

parent 0829b6b4
package emps.v2_obiektowo;
import java.util.List;
public class Grupowanie_Switch {
// Ta wersja tylko jako wprowadzenie do wersji ze słownikami.
// Gdybyśmy dla każdego joba mieli oddzielną zmienną do liczenia sumy,
// moglibyśmy wszystko policzyć w jednej pętli.
// Problem:
// 1) program powinien czytać dowolne dane; nie powinien z góry zakładać, jakie są joby
// 2) każdy nowy job zwiększa ilość kodu.
// → jesli zamiast oddzielnych zmiennych użyjemy jednego słownika, to zrobimy to samo, ale zwięźlej
// słownik (Map) z kluczami typu String może być traktowany jako namiasta zestawu zmiennych,
// który możemy łatwo rozszerzać gdy pojawiają się nowe wartości
public static void main(String[] args) {
List<Employee> emps = ObslugaCSV.wczytajDane();
double sumaProgrammer = 0;
double sumaAccountant = 0;
double sumaPresident = 0;
// itd....
for (Employee emp : emps) {
switch(emp.getJobTitle()) {
case "Programmer" -> sumaProgrammer += emp.getSalary();
case "Accountant" -> sumaAccountant += emp.getSalary();
case "President" -> sumaPresident += emp.getSalary();
}
}
System.out.println(sumaProgrammer);
System.out.println(sumaAccountant);
System.out.println(sumaPresident);
}
}
package emps.v2_obiektowo;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
public class Grupowanie_v6 {
public static void main(String[] args) {
List<Employee> emps = ObslugaCSV.wczytajDane();
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.v2_obiektowo;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
// Podejście obiektowe do grupowania.
public class Grupowanie_v7 {
public static void main(String[] args) {
final List<Employee> emps = ObslugaCSV.wczytajDane();
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();
}
}
}
package emps.v2_obiektowo;
import java.time.LocalDate;
public class Porownywanie {
public static void main(String[] args) {
Employee emp1 = new Employee(1, "Jan", "Kowalski", "kierowca", 4400, LocalDate.of(1990, 4, 5), "transport", "Jasna 14", "01-234", "Warszawa", "Polska");
Employee emp2 = new Employee(1, "Jan", "Kowalski", "kierowca", 4400, LocalDate.of(1990, 4, 5), "transport", "Jasna 14", "01-234", "Warszawa", "Polska");
Employee emp3 = new Employee(3, "Janina", "Kowalska", "kierowca", 4400, LocalDate.of(1990, 4, 5), "transport", "Jasna 14", "01-234", "Warszawa", "Polska");
Employee emp4 = emp1;
System.out.println(emp1);
System.out.println(emp2);
System.out.println(emp3);
System.out.println();
System.out.println("==");
System.out.println(emp1 == emp1);
System.out.println(emp1 == emp2);
System.out.println(emp1 == emp3);
System.out.println(emp1 == emp4);
System.out.println();
System.out.println("eq");
System.out.println(emp1.equals(emp1));
System.out.println(emp1.equals(emp2));
System.out.println(emp1.equals(emp3));
System.out.println(emp1.equals(emp4));
// Domyślna implementacja equals, tak samo jak operacja ==, porównuje adresy obiektów.
// Sprawdza, czy to jest TEN SAM obiekt (a nie TAKI SAM).
// Aby equals sprawdzało czy obiekty zawierają te same dane, powinniśmy przedefiniować (Override)metodę equals w definicji klasy.
}
}
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