Commit b02d960b by Patryk Czarnik

Enkapsulacja i kolekcje

parent 0418cef7
...@@ -60,7 +60,7 @@ public class Dziedziczenie2 { ...@@ -60,7 +60,7 @@ public class Dziedziczenie2 {
System.out.println(((Student) ktos).rok); System.out.println(((Student) ktos).rok);
} }
// Od Javy 17 (?) jest dostępne instanceof, które od razu wpisuje wynik do // Od Javy 17 jest dostępne instanceof, które od razu wpisuje wynik do
// zmiennej: // zmiennej:
if (ktos instanceof Student s5) { if (ktos instanceof Student s5) {
s5.dodajOcene(4); s5.dodajOcene(4);
......
package p16_overloading;
public class BiletUlgowy1 {
private static class Osoba {
}
private static class Student extends Osoba {
}
// Oczekiwana logika: jeśli klientem jest zwykła osoba, to bilet kosztuje 100,
// a jeśli student, to 50
static int cenaBiletu(Osoba klient) {
// instanceof sprawdza W CZASIE DZIAŁANIA, jakiej klasy jest obiekt w pamięci
if(klient instanceof Student) {
return 50;
} else {
return 100;
}
}
public static void main(String[] args) {
Osoba o = new Osoba();
Student s = new Student();
System.out.println("Cena biletu dla osoby: " + cenaBiletu(o));
System.out.println("Cena biletu dla studenta: " + cenaBiletu(s));
System.out.println();
Osoba[] osoby = {o, s};
for (Osoba klient : osoby) {
System.out.println("Dla obiektu klasy " + klient.getClass().getSimpleName()
+ " sprzedajemy bilet za cenę " + cenaBiletu(klient));
}
}
}
package p16_overloading;
// Uwaga, to jest złe rozwiązanie!
public class BiletUlgowy2 {
private static class Osoba {
}
private static class Student extends Osoba {
}
// Oczekiwana logika: jeśli klientem jest zwykła osoba, to bilet kosztuje 100,
// a jeśli student, to 50
static int cenaBiletu(Osoba klient) {
return 100;
}
static int cenaBiletu(Student klient) {
return 50;
}
public static void main(String[] args) {
Osoba o = new Osoba();
Student s = new Student();
System.out.println("Cena biletu dla osoby: " + cenaBiletu(o));
System.out.println("Cena biletu dla studenta: " + cenaBiletu(s));
System.out.println();
Osoba[] osoby = {o, s};
for (Osoba klient : osoby) {
System.out.println("Dla obiektu klasy " + klient.getClass().getSimpleName()
+ " sprzedajemy bilet za cenę " + cenaBiletu(klient));
}
// Overloading jest techniką czasu kompilacji.
// To kompilator na podstawie ZADEKLAROWANEGO TYPU (zmiennej lub wartości)
// ustala, której wersji metody użyje. Na ten wybór nie wpływa faktyczna klasa obiektu w pamięci w czasie działania.
// Tutaj zmienna klient jest typu Osoba, więc w linii 34 ZAWSZE zostanie użyta metoda cenaBiletu(Osoba) (a nie Student)
}
}
package p16_overloading;
public class BiletUlgowy3 {
private static class Osoba {
double znizka() {
return 0;
}
}
private static class Student extends Osoba {
@Override
double znizka() {
return 0.5;
}
}
// technika overriding (nadpisywanie metod) działa w oparciu o faktyczną klase obiektu
// w czasie działania (runtime)
static int cenaBiletu(Osoba klient) {
double cenaPodstawowa = 100;
return (int)(cenaPodstawowa * (1.0 - klient.znizka()));
}
public static void main(String[] args) {
Osoba o = new Osoba();
Student s = new Student();
System.out.println("Cena biletu dla osoby: " + cenaBiletu(o));
System.out.println("Cena biletu dla studenta: " + cenaBiletu(s));
System.out.println();
Osoba[] osoby = {o, s};
for (Osoba klient : osoby) {
System.out.println("Dla obiektu klasy " + klient.getClass().getSimpleName()
+ " sprzedajemy bilet za cenę " + cenaBiletu(klient));
}
}
}
package p16_overloading;
// Czasami nie jest oczywiste, czy to, co robimy w podklasie, to jest override, czy overload.
// O tym jest ten przykład.
// Analogiczny przykład "z życia" - próba definiowania equals w taki sposób,
// że parametr nie jest typu Object, tylko np. typu Osoba.
public class OverloadingVsOverriding {
private static class Nadklasa {
public void print(Number arg) {
System.out.println("Nadklasa Number " + arg);
}
// nie ma metody od Byte
public void print(Integer arg) {
System.out.println("Nadklasa Integer " + arg);
}
}
private static class Podklasa extends Nadklasa {
public void print(Number arg) {
System.out.println("Podklasa Number " + arg + " obiekt jest klasy " + arg.getClass().getSimpleName());
}
public void print(Byte arg) {
System.out.println("Podklasa Byte " + arg);
}
}
public static void main(String[] args) {
Integer ii = 7000;
Byte bb = 5;
Number n = ii;
Nadklasa nad = new Nadklasa();
nad.print(ii);
nad.print(bb);
System.out.println();
Podklasa pod = new Podklasa();
pod.print(ii);
pod.print(bb);
pod.print(n);
System.out.println();
Nadklasa zmienna = pod;
zmienna.print(ii);
zmienna.print(bb);
zmienna.print(n);
}
}
package p16_overloading;
public class PrzeciazanieTypowLiczbowych {
static void print(Byte i) {
System.out.println("Byte " + i);
}
static void print(int i) {
System.out.println("int " + i);
}
static void print(String s) {
System.out.println("String " + s);
}
static void print(Object o) {
System.out.println("Obiekt klasy " + o.getClass().getSimpleName() + ", " + o);
}
public static void main(String[] args) {
// przeciążanie / overloading to technika
// pozwalająca napisać wiele metod o tej samej nazwie, które róznią się liczbą lub typem argumentów
// to kompilator decyzuje o tym, która metoda zostanie użyta
// na podstawie typu parametru
print(13);
print("ala");
print('A'); // char pasuje do typu int
// short jest poszerzany do typu int
// technika "widening" (tylko dla typów prostych) - ona ma wyższy priorytet
short sh = 10_000;
print(sh);
// long jest zamieniany na obiekt klasy Long i pasuje do metody typu Object
// technika "boxing" - ona ma niższy priorytet niż widening
long l = 10;
print(l);
// Tutaj będzie widać, że widening jest stosowany w pierwszej kolejności względem boxingu
// byte bardziej pasuje to typu int, niż do typu Byte
byte b = 127;
print(b);
Integer ii = 1024;
// Tu zadziała Object, ale gdyby go nie było, to zadziałałby "unboxing" i zostałby użyty int.
print(ii);
}
}
Techniki tworzenia obiektów w Java:
- publiczny konstruktiur lub wiele konstruktorów
- klasy i metody fabryczne (factory / factory method)
- tu mniej chodzi o parametry, a bardziej o możliwość wyboru klasy z imlementacją
- metody statyczne zwracające nowy obiekt
- wzorzec builder:
- istnieje pomocnicza klasa, która słuzy do zbierania parametró, zwykle za pomocą metody with i zapisu .łańcuchowego
- tworzenie obiektu najpierw tworzy obiekt pomocniczy, ustawia wszystkie parametry i kończy się wywołaniem .build(), co tworzy obiekt finalny
Osoba ktos = Osoba.createNew("Ala", "Kowalska").withSecondName("Katarzyna").withBirthDate("1990-01-01").build();
IMHO bzdurami są teksty mówiące, że Builder MUSI być klasą wewnętrzną i że pierwszy krok MUSI wyglądać tak:
- new Osoba.Builder()
Przykłady, które kojarzę:
- klasa Request występująca w technologii JAX-RS (usługi REST w Jakarte EE)
- konfiguracja formatu danych w bibliotece Apache Commons CSV
package p14_enkapsulacja_i_testy;
/* To jest klasa wyjątku.
* Jeśli dziedziczymy z Exception, to wyjątek będzie "sprawdzany" przez kompilator ("checked")
* - gdy wystąpi w kodzie, to TRZEBA go wyłapać lub zadeklarować za pomocą throws.
* Jeśli dziedziczymy z RuntimeException (lub także z Error), to wyjątek nie będzie sprawdzany przez kompilator
* (będzie "unchecked") - nie ma obowiązku wyłapywania go lub deklarowania, ale istnieje taka możliwość.
*/
public class BrakSrodkow extends Exception {
public BrakSrodkow(String message) {
super(message);
}
}
package p14_enkapsulacja_i_testy;
public class Konto {
private final int numer;
private int saldo;
private Osoba wlasciciel;
public Konto(int numer, int saldo, Osoba wlasciciel) {
if(saldo < 0) {
throw new IllegalArgumentException("ujemne saldo!");
}
this.numer = numer;
this.saldo = saldo;
this.wlasciciel = wlasciciel;
}
public int getNumer() {
return numer;
}
public int getSaldo() {
return saldo;
}
public Osoba getWlasciciel() {
return wlasciciel;
}
public void setWlasciciel(Osoba wlasciciel) {
this.wlasciciel = wlasciciel;
}
@Override
public String toString() {
return "Konto nr " + numer + ", saldo " + saldo + ", wł. " + wlasciciel;
}
public void wplata(int kwota) {
if(kwota <= 0) {
throw new IllegalArgumentException("kwota wpłaty nie jest dodatnia");
}
saldo += kwota;
// aby zabezpieczyć się przed IntegerOveflow,
// można by użyć saldo = Math.addExact(saldo, kwota);
}
public void wyplata(int kwota) throws BrakSrodkow {
if(kwota <= 0) {
throw new IllegalArgumentException("kwota wypłaty nie jest dodatnia");
}
if(kwota > saldo) {
throw new BrakSrodkow("Za mało kasy");
}
saldo -= kwota;
}
public void przelew(Konto inne, int kwota) throws BrakSrodkow {
if(kwota <= 0) {
throw new IllegalArgumentException("kwota przelewu nie jest dodatnia");
}
if(kwota > saldo) {
throw new BrakSrodkow("Za mało kasy");
}
this.saldo -= kwota;
inne.saldo += kwota;
}
}
package p14_enkapsulacja_i_testy;
import java.time.LocalDate;
import java.time.Period;
public class Osoba {
private String imie;
private String nazwisko;
private LocalDate dataUrodzenia;
public Osoba(String imie, String nazwisko, LocalDate dataUrodzenia) {
this.imie = imie;
this.nazwisko = nazwisko;
this.dataUrodzenia = dataUrodzenia;
}
public Osoba(String imie, String nazwisko, String dataUrodzenia) {
this(imie, nazwisko, LocalDate.parse(dataUrodzenia));
}
public String getImie() {
return imie;
}
public String getNazwisko() {
return nazwisko;
}
public int getWiek() {
Period p = Period.between(dataUrodzenia, LocalDate.now());
return p.getYears();
}
public LocalDate getDataUrodzenia() {
return dataUrodzenia;
}
public void setImie(String imie) {
this.imie = imie;
}
public void setNazwisko(String nazwisko) {
if(nazwisko == null) {
throw new NullPointerException("nazwisko is null");
}
this.nazwisko = nazwisko;
}
@Override
public String toString() {
return "Osoba [imie=" + imie + ", nazwisko=" + nazwisko + ", dataUrodzenia=" + dataUrodzenia + ", wiek="
+ getWiek() + "]";
}
}
package p14_enkapsulacja_i_testy;
import java.time.LocalDate;
public class Program {
public static void main(String[] args) {
Osoba ala = new Osoba("Ala", "Kowalska", LocalDate.of(1990, 2, 17));
System.out.println(ala);
// System.out.println(ala.imie + " " + ala.nazwisko);
System.out.println(ala.getImie() + " " + ala.getNazwisko());
// ala.imie = "Alicja";
ala.setImie("Alicja");
System.out.println(ala.getWiek());
Konto konto = new Konto(1, 1000, ala);
System.out.println(konto);
// konto.saldo = 100000;
// konto.saldo -= 500;
konto.wplata(400);
System.out.println(konto); // powinno by? 1400
// assert konto.getSaldo() == 1400;
// konto.wplata(-700);
// System.out.println(konto);
//
// konto.wyplata(2000);
// System.out.println(konto);
try {
konto.wyplata(100);
} catch (BrakSrodkow e) {
e.printStackTrace();
}
System.out.println("Koniec");
}
}
package p14_enkapsulacja_i_testy;
import java.util.Scanner;
public class ProgramBankowy {
public static void main(String[] args) {
@SuppressWarnings("resource")
Scanner sc = new Scanner(System.in);
Osoba ala = new Osoba("Ala", "Kowalska", "1985-05-05");
System.out.print("Podaj początkową kwotę: ");
int kwota = sc.nextInt();
sc.nextLine(); // wymuszenie przejścia do nowej linii
Konto konto = new Konto(1, kwota, ala);
System.out.println(konto);
petla:
while(true) {
try {
System.out.println("Co chcesz zrobić? W - wpłata, Y - wypłata, K - koniec");
String wybor = sc.nextLine().toUpperCase();
switch(wybor) {
case "K", "Q" -> {
break petla; // przejście do Koniec programu
}
case "W" -> {
System.out.print("Podaj kwotę wpłaty: ");
kwota = sc.nextInt();
sc.nextLine();
konto.wplata(kwota);
System.out.println("Pieniądze zostały wpłacone");
}
case "Y" -> {
System.out.print("Podaj kwotę wypłaty: ");
kwota = sc.nextInt();
sc.nextLine();
konto.wyplata(kwota);
// ta linia wykona się tylko jeśli nie było wyjątku:
System.out.println("Pieniądze zostały wypłacone");
}
default -> {
System.out.println("Nieznane polecenie");
continue petla; // Przejście do Co chcesz zrobić
}
}
// Jeśli o różnych sytuacjach błędnych będą informować wyjątki różnych klas,
// to w programie możemy te sytuacje rozróżnić i obsłużyć w róznych catchach
} catch(IllegalArgumentException e) {
System.out.println("Niepoprawny argument: " + e.getMessage());
// } catch(BrakSrodkow e) {
// System.out.println(e.getMessage());
} catch(Exception e) {
System.out.println("Inny błąd: " + e);
}
System.out.println();
System.out.println(konto);
System.out.println();
}
System.out.println("Koniec programu");
}
}
package gotowe.p25_kolekcje.a_list;
import java.util.ArrayList;
import java.util.List;
public class DeklaracjeGeneryczne {
public static void main(String[] args) {
List l1 = new ArrayList();
ArrayList l2 = new ArrayList();
List<String> l3 = new ArrayList<String>();
List<String> l4 = new ArrayList<>(); // diamond operator od Javy 7
List<String> l5 = new ArrayList();
List l6 = new ArrayList<>(); // lista Object-ów
//NK List<> l7 = new ArrayList<String>();
List<List<Integer>> l8 = new ArrayList<>();
//NK List<List<Integer>> l9 = new ArrayList<<>>();
//NK List<List<Integer>> l10 = new ArrayList<List<>>();
List<List<Integer>> l11 = new ArrayList<List<Integer>>();
//NK List<int> l12 = new ArrayList<>();
List<int[]> l13 = new ArrayList<>();
// "lista nie wiadomo czego"
// w praktyce takiej listy mogę używać tylko do odczytu, nie mogę w niej niczego zapisać
List<?> l14 = new ArrayList<>();
List<?> l15 = new ArrayList<String>();
// l15.add("ala");
// to nie to samo, co lista Objectów, bo np lista Stringów nie jest tym samym co lista Objectów, i nie można wpisać
//NK List<Object> l16 = new ArrayList<String>();
}
}
package gotowe.p25_kolekcje.a_list;
import java.util.ArrayList;
import java.util.List;
public class ListaLiczb {
public static void main(String[] args) {
//NK List<int> lista = new ArrayList<>();
List<Integer> lista = new ArrayList<>();
lista.add(5);
lista.add(6);
lista.add(7);
lista.add(8);
lista.add(9);
lista.add(10);
System.out.println(lista);
System.out.println("rozmiar: " + lista.size());
// if(lista.remove(5)) {
// }
Integer element = lista.remove(5); // wg indeksu
System.out.println("Usunięty element: " + element);
System.out.println(lista);
Integer x = 9;
if(lista.remove(x)) { // wg wartości
System.out.println("usunąłem wartość 9");
}
boolean b = lista.remove((Integer)5); // OK, wg wartości
// boolean b = lista.remove((Object)5); // wg wartości
System.out.println("Czy usunięto? " + b);
System.out.println(lista);
}
}
package gotowe.p25_kolekcje.a_list;
import java.util.List;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
public class Listy {
public static void main(String[] args) {
List<String> lista = new ArrayList<>();
System.out.println(lista);
// dodaje na koniec
lista.add("ola");
lista.add("ala");
boolean coSieStalo = lista.add("ela");
System.out.println(coSieStalo);
if(lista.add("iza")) {
System.out.println("Iza też");
}
System.out.println(lista);
System.out.println();
// odczyt z określonej pozycji, numeracja od 0 jak w tablicach
String x = lista.get(0); // lista[0] - tak się nie da
System.out.println(x);
x = lista.get(2);
System.out.println(x);
//EXN x = lista.get(lista.size());
// System.out.println(x);
// dodaje na okreslona pozycje, przesuwa dotychczasowe elementy w prawo
// tu może być od 0 do 4, ale już nie 5 (IOOBExn)
lista.add(2, "ewa");
lista.add(lista.size(), "ostatnia"); // OK
System.out.println(lista);
// nadpisuje element na podanej pozycji nowym elementem
lista.set(2, "ula");
System.out.println(lista);
System.out.println();
lista.add(0, "ala");
System.out.println(lista);
// usuwa z określonej pozycji, zwraca obiekt
String wynik = lista.remove(3);
System.out.println("usunąłem element : " + wynik);
System.out.println(lista);
// to by usunęło od razu wszystkie wystąpienia elementu "ala"
// boolean b = lista.removeAll(Collections.singleton("ala"));
// to usuwa pierwsze wystąpienie, elementy są porównywane za pomocą equals, wynik boolean mówi czy element został usunięty
boolean b = lista.remove("ala");
System.out.println("bool : " + b);
System.out.println(lista);
b = lista.remove("ala");
System.out.println("bool : " + b);
System.out.println(lista);
b = lista.remove("ala");
System.out.println("bool : " + b);
System.out.println(lista);
System.out.println();
lista.addAll(Arrays.asList("ola", "ela", "ewa", "kasia", "marysia", "aga"));
System.out.println(lista);
System.out.println("indexOf: " + lista.indexOf("ewa"));
System.out.println("contains: " + lista.contains("ewa"));
System.out.println();
System.out.println("indexOf: " + lista.indexOf("Ewa")); // -1
System.out.println("contains: " + lista.contains("Ewa")); // false
System.out.println();
Collections.sort(lista);
System.out.println(lista);
for(String s : lista) {
System.out.println("Kolejny element: " + s);
}
}
}
package gotowe.p25_kolekcje.a_list;
import java.util.ArrayList;
import java.util.List;
public class ListyAll {
public static void main(String[] args) {
List<String> a = new ArrayList<>();
a.add("Ala");
a.add("Ola");
a.add("Ela");
a.add("Ula");
System.out.println("a = " + a);
List<String> b = new ArrayList<>(a);
System.out.println("a = " + b);
List<String> c = new ArrayList<>();
c.add("Ala");
c.add("Ula");
System.out.println("c = " + c);
List<String> d = new ArrayList<>();
d.add("Ala");
d.add("Gosia");
System.out.println("d = " + d);
d.addAll(a);
System.out.println("d = " + d);
System.out.println(a.containsAll(c)); // T
System.out.println(c.containsAll(a)); // F
c.add("Basia"); // nie ma w a
System.out.println("c = " + c);
boolean czy = a.removeAll(c);
System.out.println(czy); // T
System.out.println("a = " + a); // usunął Ala i Ula, a nie przejął się Basią
System.out.println();
a.add("Genowefa");
a.add("Hermenegilda");
a.add("Genowefa");
System.out.println("a = " + a);
System.out.println("b = " + b);
// zostawia w liście a tylko te elementy, które wystepują w b
czy = a.retainAll(b);
System.out.println("retainAll " + b);
System.out.println("a = " + a);
System.out.println("b = " + b);
}
}
package gotowe.p25_kolekcje.a_list;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;
public class NoweOperacjeList {
public static void main(String[] args) {
ArrayList<String> lista = new ArrayList<>();
lista.add("Ala");
lista.add("Ola");
lista.add("Kasia");
lista.add("Ela");
lista.add("Łucja");
lista.add("Ula");
lista.add("Asia");
lista.add("Zosia");
System.out.println(lista);
System.out.println();
lista.sort(null);
// lista.sort(Comparator.reverseOrder());
lista.sort(Collator.getInstance());
// lista.sort(Collator.getInstance(Locale.CHINA));
// lista.sort(Collator.getInstance().reversed());
System.out.println(lista);
System.out.println();
lista.forEach(s -> System.out.print(s + ", "));
System.out.println();
System.out.println();
List<String> lista1 = (List<String>)lista.clone();
System.out.println(lista1);
// predykat; operacja usuwa z listy wszystkie spełaniające warunek
lista1.removeIf(s -> s.length() <= 3);
System.out.println(lista1);
System.out.println();
List<String> lista2 = (List<String>)lista.clone();
System.out.println(lista2);
lista2.replaceAll(s -> s.toUpperCase()); // lambda expression
// lista2.replaceAll(String::toUpperCase); // method reference - w tym przypadku równoważnie
System.out.println(lista2);
System.out.println();
}
}
package gotowe.p25_kolekcje.a_list;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class PorownanieSzybkosciList {
public static void testujListe(List<Integer> lista) {
long start, koniec;
int suma;
System.out.print("Wstawianie 250 tys. na koniec listy (add)... ");
start = System.currentTimeMillis();
for(int i=0; i<250000; i++) {
lista.add(i);
}
koniec = System.currentTimeMillis();
System.out.println(koniec - start + " ms");
lista.clear(); // usuwa całą zawartość
System.out.print("Wstawianie 500 tys. na koniec listy (add)... ");
start = System.currentTimeMillis();
for(int i=0; i<500000; i++) {
lista.add(i);
}
koniec = System.currentTimeMillis();
System.out.println(koniec - start + " ms");
System.out.println("\nDodawanie na początek... ");
start = System.currentTimeMillis();
for(int i=0; i < 10000; i++) {
lista.add(0, 333); // 333 jest elementem (wartością) a nie indeksem
// Szybko dla LinkedList, wolno dla ArrayList
}
koniec = System.currentTimeMillis();
System.out.println(koniec - start + " ms");
System.out.println("\nWybieranie po indeksie... ");
start = System.currentTimeMillis();
suma = 0;
for(int i=0; i < 5000; i++) {
suma += lista.get(i * 100);
// Szybkie dla ArrayList, wolne dla LinkedList
}
koniec = System.currentTimeMillis();
System.out.println(koniec - start + " ms");
System.out.println("wynik="+suma);
System.out.println("\nOdczytanie wszystkich elementów foreach");
start = System.currentTimeMillis();
suma = 0;
for(int x : lista) {
suma += x;
}
koniec = System.currentTimeMillis();
System.out.println(koniec - start + " ms");
System.out.println("wynik="+suma);
}
public static void main(String[] args) {
List<Integer> linked = new LinkedList<>();
List<Integer> tablicowa = new ArrayList<>();
System.out.println("LinkedList:");
testujListe(linked);
System.out.println("\n\n================");
System.out.println("ArrayList:");
testujListe(tablicowa);
}
}
package gotowe.p25_kolekcje.b_set_map;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.TreeSet;
public class ListyIZbiory {
public static void main(String[] args) {
ArrayList<String> al = new ArrayList<>();
LinkedList<String> lista = new LinkedList<>();
HashSet<String> hasz = new HashSet<>();
LinkedHashSet<String> linkedHasz = new LinkedHashSet<>();
TreeSet<String> drzewo = new TreeSet<>();
al.add("ala"); lista.add("ala"); drzewo.add("ala"); hasz.add("ala"); linkedHasz.add("ala");
al.add("ola"); lista.add("ola"); drzewo.add("ola"); hasz.add("ola"); linkedHasz.add("ola");
al.add("ela"); lista.add("ela"); drzewo.add("ela"); hasz.add("ela"); linkedHasz.add("ela");
al.add("ula"); lista.add("ula"); drzewo.add("ula"); hasz.add("ula"); linkedHasz.add("ula");
al.add("ola"); lista.add("ola"); drzewo.add("ola"); hasz.add("ola"); linkedHasz.add("ola");
System.out.println("ArrayList: "+al);
System.out.println("LinkedList: "+lista);
System.out.println("TreeSet: "+drzewo);
System.out.println("HashSet: "+hasz);
System.out.println("LinkedHashSet: "+linkedHasz);
System.out.println();
// dla wszystkich list wolno działa operacja contains / indexOf
System.out.println(al.contains("ela"));
// dla wszystkich zbiorów szybko działa operacja contains
System.out.println(hasz.contains("ela"));
}
}
package gotowe.p25_kolekcje.b_set_map;
import java.util.ArrayList;
import java.util.List;
import java.util.TreeMap;
public class NoweOperacjeMap {
public static void main(String[] args) {
TreeMap<String, Integer> map = new TreeMap<>();
map.put("Ala", 20);
map.put("Ola", 30);
System.out.println(map);
map.putIfAbsent("Ala", 25); // nie wpisuje
map.putIfAbsent("Ela", 45); // wpisuje
System.out.println(map);
map.replace("Ala", 28); // zamienia
map.replace("Ula", 48); // nic się nie dzieje
System.out.println(map);
map.replace("Ala", 40, 41); // jeśli taka była poprzednia wartość - tutaj nic się nie stanie
System.out.println(map);
map.replaceAll((k, v) -> v+1); // zwiększa wszystkie wartości o 1
System.out.println(map);
map.replaceAll((k, v) -> k.startsWith("A") ? v+1 : v); // zwiększa o 1 tylko słowa na literę A
System.out.println(map);
// dodaje nowy wpis z wartością 10, albo dodaje 10 do istniejącej wartości
map.merge("Ola", 10, Math::addExact); // (x,y) -> x+y
map.merge("Ewa", 10, Math::addExact);
System.out.println(map);
System.out.println();
// Zamiast pętli, możena elementy przeglądać w ten sposób:
map.forEach((k, v) -> {
System.out.println("Klucz " + k + " ma wartość " + v);
});
}
}
package gotowe.p25_kolekcje.b_set_map;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
public class Slowniki {
public static void main(String[] args) {
Map<String, Integer> hasz = new HashMap<>();
Map<String, Integer> linkedHasz = new LinkedHashMap<>();
Map<String, Integer> drzewo = new TreeMap<>();
hasz.put("ala", 20); drzewo.put("ala", 20); linkedHasz.put("ala", 20);
hasz.put("ola", 30); drzewo.put("ola", 20); linkedHasz.put("ola", 30);
hasz.put("ela", 20); drzewo.put("ela", 20); linkedHasz.put("ela", 20);
hasz.put("ula", 55); drzewo.put("ula", 55); linkedHasz.put("ula", 55);
System.out.println(hasz.get("ela")); //20
System.out.println(hasz.get("ewa")); //null
System.out.println(hasz.containsKey("ela")); // szybkie
System.out.println(hasz.containsValue(55)); // wolne
System.out.println("\nTreeMap: "+drzewo);
System.out.println("HashMap: "+hasz);
System.out.println("LinkedHashMap: "+linkedHasz);
System.out.println("====================================\n");
hasz.put("ola", 31); drzewo.put("ola", 31); linkedHasz.put("ola", 31);
System.out.println("TreeMap: "+drzewo);
System.out.println("HashMap: "+hasz);
System.out.println("LinkedHashMap: "+linkedHasz);
System.out.println("\nWszystkie wpisy:");
for(Map.Entry<String, Integer> entry : drzewo.entrySet()) {
System.out.println(entry.getKey() + " -> " + entry.getValue());
}
System.out.println("\nWszystkie klucze:");
for(String s : drzewo.keySet()) {
System.out.println(s);
}
System.out.println("\nWszystkie wartości:");
for(Integer i : drzewo.values()) {
System.out.println(i);
}
// Można też przypisać na zmienne:
Set<Map.Entry<String, Integer>> zbiorWpisow = hasz.entrySet();
Set<String> klucze = hasz.keySet();
Collection<Integer> wartosci = hasz.values();
// Jak zrobić listę kluczy?
List<String> kluczel = new ArrayList<>(hasz.keySet());
}
}
package gotowe.p25_kolekcje.b_set_map;
import java.util.Arrays;
import java.util.SortedSet;
import java.util.TreeSet;
public class Tree1 {
public static void main(String[] args) {
// TreeSet implementuje dodatkowe interfejsy:
// SortedSet<String>
// NavigableSet<String>
TreeSet<String> imiona = new TreeSet<>(
Arrays.asList("Ala", "Ola", "Ula", "Ela", "Ewa", "Ania", "Kasia", "Aga", "Iwona", "Magda", "Iza"));
System.out.println(imiona);
SortedSet<String> head1 = imiona.headSet("Iwona");
System.out.println(head1); // obejmuje wszystkie elementy < Iwona
SortedSet<String> head2 = imiona.headSet("Iwona", true);
System.out.println(head2); // obejmuje wszystkie elementy <= Iwona
SortedSet<String> tail1 = imiona.tailSet("Iwona");
System.out.println(tail1); // obejmuje wszystkie elementy >= Iwona
SortedSet<String> tail2 = imiona.tailSet("Iwona", false);
System.out.println(tail2); // obejmuje wszystkie elementy > Iwona
// headSet i tailSet (bez parametru inclusive) dają łącznie cały zbiór
System.out.println();
// Jako granicę można podawać także elementy niewystępujące w kolekcji
SortedSet<String> head3 = imiona.headSet("Jola");
System.out.println(head3);
SortedSet<String> sub1 = imiona.subSet("Ela", "Iwona"); // domyslnie inclusive: true / false
System.out.println(sub1);
SortedSet<String> sub2 = imiona.subSet("Ela", true, "Iwona", true);
System.out.println(sub2);
System.out.println("\n############");
// to są "widoki", a nie kopie - zmiany w zbiorze pierwotnym są od razu widziane przez pobrane obiekty head/tail
System.out.println("Dodaję elementy...");
imiona.add("Julia");
imiona.add("Ewelina");
System.out.println(imiona);
System.out.println(head1);
System.out.println(tail1);
System.out.println();
System.out.println("head.add(Basia)");
head1.add("Basia");
System.out.println(imiona);
System.out.println(head1);
System.out.println(tail1);
System.out.println();
System.out.println("head.remove(Ewa)");
System.out.println("head.remove(Magda)");
head1.remove("Ewa");
head1.remove("Zosia"); // nie ma takiego elementu, nie ma błędu
head1.remove("Magda"); // nie usuwa, nie ma błędu
System.out.println(imiona);
System.out.println(head1);
System.out.println(tail1);
System.out.println();
System.out.println("head.add(Zosia)");
head1.add("Zosia"); // IllegalArgumentException: key out of range
System.out.println(imiona);
System.out.println(head1);
System.out.println(tail1);
System.out.println();
}
}
package gotowe.p25_kolekcje.b_set_map;
import java.util.Arrays;
import java.util.NavigableSet;
import java.util.TreeSet;
public class Tree2 {
public static void main(String[] args) {
NavigableSet<String> imiona = new TreeSet<>(
Arrays.asList("Ala", "Ola", "Ula", "Ela", "Ewa", "Ania", "Kasia", "Aga", "Iwona", "Magda", "Iza"));
System.out.println(imiona);
System.out.println("first: " + imiona.first());
System.out.println("last : " + imiona.last());
System.out.println(imiona);
System.out.println();
System.out.println("pętla first / higher");
String s = imiona.first();
while(s != null) {
System.out.println(s);
s = imiona.higher(s);
}
System.out.println("========================");
System.out.println("pętla last / lower");
s = imiona.last();
while(s != null) {
System.out.println(s);
s = imiona.lower(s);
}
System.out.println("========================");
System.out.println("pętla poll - usuwanie");
System.out.println("size: " + imiona.size());
while((s = imiona.pollFirst()) != null) {
System.out.println(" # " + s);
}
System.out.println("size: " + imiona.size());
// analogicznie pollLast()
}
}
package gotowe.p25_kolekcje.b_set_map;
import java.math.BigDecimal;
import java.text.Collator;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
public class ZbiorDziwnieSortowany {
public static void main(String[] args) {
TreeSet<String> normalny = new TreeSet<>();
TreeSet<String> alfabetyczny = new TreeSet<>(Collator.getInstance());
// TreeSet<String> alfabetyczny = new TreeSet<>(Collator.getInstance(new Locale("fr", "FR")));
TreeSet<String> dziwny = new TreeSet<>((a,b) -> a.length() - b.length());
normalny.add("Ala");
alfabetyczny.add("Ala");
dziwny.add("Ala");
normalny.add("Ącki");
alfabetyczny.add("Ącki");
dziwny.add("Ącki");
normalny.add("Łucja");
alfabetyczny.add("Łucja");
dziwny.add("Łucja");
normalny.add("Wiktor");
alfabetyczny.add("Wiktor");
dziwny.add("Wiktor");
normalny.add("Hermenegilda");
alfabetyczny.add("Hermenegilda");
dziwny.add("Hermenegilda");
normalny.add("Ola");
alfabetyczny.add("Ola");
dziwny.add("Ola");
// Ola jest traktowana jak == Ala, bo comparator zwraca 0 gdy napisy są tej samej długości
// TreeSet i TreeMap nie uzywają equals do sprawdzenia czy elementy sa równe, ograniczają się do użycia compare albo compareTo
System.out.println(normalny);
System.out.println(alfabetyczny);
System.out.println(dziwny);
System.out.println();
System.out.println("Sprawa BigDecimal:");
BigDecimal[] liczby = {
new BigDecimal("123.00"),
new BigDecimal("123.0"),
new BigDecimal("123"),
new BigDecimal("124"),
};
Set<BigDecimal> t = new TreeSet<>();
Set<BigDecimal> h = new HashSet<>();
for(BigDecimal b : liczby) {
t.add(b);
h.add(b);
}
System.out.println("Tree: " + t);
System.out.println("Hash: " + h);
}
}
package gotowe.p25_kolekcje.b_set_map;
import java.util.Arrays;
import java.util.HashSet;
public class ZmianaKolejnosciWHaszSecie {
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
set.addAll(Arrays.asList("Ala", "Ola", "Ula", "Ela", "Ewa", "Ania", "Kasia", "Aga", "Iwona", "Magda", "Iza"));
System.out.println(set.size());
System.out.println(set);
set.add("Julia");
System.out.println(set.size());
System.out.println(set);
set.add("Ewelina");
System.out.println(set.size());
System.out.println(set);
// for (String s : set) {
// int hash = s.hashCode();
// System.out.printf("%10s : hash = %10d , h%%16 = %2d , h%%32 = %2d\n",
// s, hash, hash%16, hash%32);
// }
}
}
package gotowe.p25_kolekcje.c_queue;
import java.util.ArrayDeque;
public class KolejkaJakoStos {
public static void main(String[] args) {
ArrayDeque<Integer> stos = new ArrayDeque<>();
System.out.println(stos);
for(int i = 1; i < 10; i++) {
System.out.println(i*i);
stos.push(i*i);
}
System.out.println();
System.out.println(stos);
System.out.println();
while(! stos.isEmpty()) {
Integer liczba = stos.pop();
System.out.println(liczba);
}
}
}
package gotowe.p25_kolekcje.c_queue;
import java.util.ArrayDeque;
import java.util.PriorityQueue;
import java.util.Queue;
public class Kolejki {
public static void main(String[] args) {
Queue<String> kolejka; // ewentualnie Deque<String>
String elem;
System.out.println("Kolejka prosta:"); // FIFO
kolejka = new ArrayDeque<>();
// kolejka = new LinkedList<>();
kolejka.add("ala");
kolejka.add("ola");
kolejka.add("ela");
kolejka.add("ula");
System.out.println("Cała: " + kolejka);
System.out.println("Dodaję aaa");
kolejka.add("aaa");
System.out.println(kolejka);
System.out.println("Wyjmuję w pętli:");
while((elem = kolejka.poll()) != null ) {
System.out.println(elem);
}
System.out.println("\nKolejka priorytetowa:");
kolejka = new PriorityQueue<>();
kolejka.add("ala");
kolejka.add("ola");
kolejka.add("ela");
kolejka.add("ula");
System.out.println("Cała: " + kolejka);
System.out.println("Dodaję aaa");
kolejka.add("aaa");
System.out.println(kolejka);
// jako pierwszy element w PriorityQueue występuje najmniejszy
System.out.println("Wyjmuję w pętli:");
while((elem = kolejka.poll()) != null) {
System.out.println(elem);
}
}
}
package gotowe.p25_kolekcje.c_queue;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Deque;
public class Kolejki_Operacje {
public static void main(String[] args) {
Deque<String> kolejka = new ArrayDeque<String>(
Arrays.asList("Ala", "Ula", "Ola", "Kasia"));
System.out.println(kolejka);
// odczyt bez usuwania, zwracają null jeśli kolejka jest pusta
System.out.println("peek / peekFirst / peekLast");
System.out.println(kolejka.peek());
System.out.println(kolejka.peekFirst());
System.out.println(kolejka.peekLast());
System.out.println();
// odczyt bez usuwania, wyrzucają wyjątek jeśli kolejka jest pusta
System.out.println("element / getFirst / getLast");
System.out.println(kolejka.element());
System.out.println(kolejka.getFirst());
System.out.println(kolejka.getLast());
System.out.println();
// dodawanie na końcu i na początku
kolejka.add("Zosia");
kolejka.addLast("Zuzia");
kolejka.addFirst("Ania");
System.out.println(kolejka);
kolejka.offer("Zosia 2");
kolejka.offerLast("Zuzia 2");
kolejka.offerFirst("Ania 2");
System.out.println(kolejka);
System.out.println();
// usuwanie - poll zwracają null jeśli kolejka jest pusta
String s;
s = kolejka.poll(); // pobiera i usuwa pierwszy element
System.out.println(s);
s = kolejka.pollFirst();
System.out.println(s);
s = kolejka.pollLast();
System.out.println(s);
System.out.println();
// usuwanie - remove wyrzucają wyjątek jeśli kolejka jest pusta
s = kolejka.remove();
System.out.println(s);
s = kolejka.removeFirst();
System.out.println(s);
s = kolejka.removeLast();
System.out.println(s);
System.out.println();
kolejka.add("Zosia");
kolejka.add("Ola");
System.out.println(kolejka);
// [Ola, Kasia, Zosia, Zuzia, Zosia, Ola]
boolean b;
b = kolejka.remove("Ola"); // usuwa jedno wystąpienie, równoważne removeFirstOccurrence
System.out.println(kolejka);
kolejka.removeLastOccurrence("Zosia");
System.out.println(kolejka);
}
}
package gotowe.p25_kolekcje.e_iterator;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
public class Iteratory {
// Kod jest napisany tak, jak pisało się w Javie 1.4
// Nie było generyków (trzeba rzutować)
// Nie było pętli for-each - trzeba używać iteratorów
public static void main(String[] args) {
List lista = new LinkedList();
lista.add("ala");
lista.add("ola");
lista.add("ela");
lista.add("ula");
System.out.println("Na początku: " + lista);
Iterator it = lista.iterator();
while(it.hasNext()) {
String element = (String)it.next();
System.out.println(element);
if("ela".equals(element)) {
it.remove();
}
}
System.out.println("Na koniec: " + lista);
}
}
package gotowe.p25_kolekcje.e_iterator;
import java.util.ListIterator;
import java.util.LinkedList;
import java.util.List;
public class IteratoryListowe {
// Iteratory wciąż mogą się przydać, najbardziej gdy używamy klasy LinkedList,
// bo w niej nie ma "random access" i właśnie za pomocą iteratora możemy
// przeglądać listę i ją modyfikować "w locie"
public static void main(String[] args) {
List<String> lista = new LinkedList<>();
lista.add("ala");
lista.add("ola");
lista.add("ela");
lista.add("ula");
System.out.println("Na początku: " + lista);
ListIterator<String> it = lista.listIterator();
while(it.hasNext()) {
String element = it.next();
System.out.println(element);
if("ela".equals(element)) {
it.add("maja"); // za element bieżący, ale nowowstawione elementy nie będą odwiedzone przez ten iterator
it.add("gucio");
} else if("ola".equals(element)) {
it.set("Aleksandra");
} else if("ula".equals(element)) {
it.remove();
}
}
System.out.println();
it = lista.listIterator(3);
while(it.hasPrevious()) {
System.out.println(it.previousIndex() + " " + it.previous());
}
System.out.println("Na koniec: " + lista);
}
}
package gotowe.p25_kolekcje.e_iterator;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Konkurencja1 {
public static void main(String[] args) {
List<String> lista = new ArrayList<>();
lista.add("ala");
lista.add("ola");
lista.add("ela");
lista.add("ula");
System.out.println("Na początku: " + lista);
// można używać wielu iteratorów do odczytu kolekcji - to jest OK
Iterator<String> it1 = lista.iterator();
while(it1.hasNext()) {
String element = it1.next();
System.out.print(element);
Iterator<String> it2 = lista.iterator();
while(it2.hasNext()) {
System.out.print(" " + it2.next().length());
}
System.out.println();
}
}
}
package gotowe.p25_kolekcje.e_iterator;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Konkurencja2 {
public static void main(String[] args) {
List<String> lista = new ArrayList<>();
lista.add("ala");
lista.add("ola");
lista.add("ela");
lista.add("ula");
System.out.println("Na początku: " + lista);
Iterator<String> it1 = lista.iterator();
while(it1.hasNext()) {
String element = it1.next();
System.out.print(element);
Iterator<String> it2 = lista.iterator();
while(it2.hasNext()) {
String elem2 = it2.next();
System.out.print(" " + elem2.length());
if(elem2.charAt(0) == 'o') {
it2.remove();
}
}
System.out.println();
}
// Jesli uzywamy iterator (it1) a w tym czasie w inny sposób zmienimy kolekcję
// (np. innym iteratorem), to kolejna operacja na tym pierwszym iteratorze skończy sie wjątkiem ConcurrectModificationEx
}
}
package gotowe.p25_kolekcje.e_iterator;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Konkurencja3 {
public static void main(String[] args) {
List<String> lista = new ArrayList<>();
lista.add("ala");
lista.add("ola");
lista.add("ela");
lista.add("ula");
System.out.println("Na początku: " + lista);
// wyjątek pojawia się także gdy modyfikujemy listę metodami add/remove
// w trakcie przeglądania jej jakimś iteratorem
Iterator<String> it = lista.iterator();
while(it.hasNext()) {
String element = it.next();
System.out.println(element);
if(element.charAt(0) == 'o') {
// lista.set(3, "Agata"); // to nie spowodowało błędu
lista.remove(2); // to psuje działanie pętli for-each
// lista.add("ewa"); // to też psuje
System.out.println("już usunąłem");
//break;
}
}
System.out.println("koniec");
}
}
package gotowe.p25_kolekcje.e_iterator;
import java.util.ArrayList;
import java.util.List;
public class Konkurencja4 {
public static void main(String[] args) {
List<String> lista = new ArrayList<>();
lista.add("ala");
lista.add("ola");
lista.add("ela");
lista.add("ula");
System.out.println("Na początku: " + lista);
// wyjątek pojawia się także gdy modyfikujemy listę metodami add/remove
// w trakcie przeglądania jej jakimś iteratorem
// pętla for-each ma w sobie zaszyty niejawny iterator
for (String element : lista) {
System.out.println(element);
if(element.charAt(0) == 'o') {
// lista.set(3, "Agata"); // to nie spowodowało błędu
lista.remove(2); // to psuje działanie pętli for-each
// lista.add("ewa"); // to też psuje
System.out.println("już usunąłem");
}
}
}
}
package gotowe.p25_kolekcje.e_iterator;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class Konkurencja6 {
public static void main(String[] args) {
List<String> lista = new ArrayList<>();
lista.add("Ala");
lista.add("Ola");
lista.add("Ela");
lista.add("Ula");
System.out.println(lista);
String a, b, c;
Iterator<String> it1 = lista.iterator();
a = it1.next();
System.out.println("it1 jest na pozycji " + a);
ListIterator<String> it2 = lista.listIterator();
it2.next();
b = it2.next();
System.out.println("it2 jest na pozycji " + b);
a = it1.next();
a = it1.next();
System.out.println("it1 jest na pozycji " + a);
// dopóki tylko odczytujemy elementy kolekcji, można używać wielu iteratorów jednocześnie
System.out.println();
it2.add("Jola");
// it2.remove();
// lista.add("Fasola");
System.out.println("dodałem nowy element za pomocą it2");
System.out.println(lista);
try {
// Kolekcja została zmodyfikowana nie poprzez iterator it1.
// Teraz próba wykonania operacji poprzed it1 kończy się wyjątkiem.
System.out.println("przesuwam it1");
a = it1.next();
System.out.println("it1 jest na pozycji " + a);
} catch (Exception e) {
System.out.println("Wyjątek " + e);
}
}
}
package gotowe.p25_kolekcje.e_iterator;
import java.util.ArrayList;
import java.util.List;
public class Konkurencja7a {
public static void main(String[] args) {
List<String> lista = new ArrayList<>();
lista.add("Ala");
lista.add("Ola");
lista.add("Ela");
lista.add("Ula");
System.out.println(lista);
for (String s : lista) {
System.out.println(s);
if(s.equals("Ela")) {
lista.add("Nowy"); // EXN
}
}
}
}
package gotowe.p25_kolekcje.e_iterator;
import java.util.ArrayList;
import java.util.List;
public class Konkurencja7b {
public static void main(String[] args) {
List<String> lista = new ArrayList<>();
lista.add("Ala");
lista.add("Ola");
lista.add("Ela");
lista.add("Ula");
System.out.println(lista);
for (String s : lista) {
System.out.println(s);
if(s.equals("Ela")) {
lista.set(3, "Urszula"); // nie powoduje błędu
}
}
}
}
package p18_zbierz_dane;
import java.util.Arrays;
import java.util.Scanner;
// Program pobiera od użytkownika wiele imion i zapisuje w pamięci, aby później wypisać...
// W tej wersji imiona zapamiętujemy w tablicy.
// Tworząc tablicę musimy podać jej rozmiar.
// Tablice nie są tak elastyczne, jak listy i inne kolekcje,
public class P1_Tablica {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.print("Ile imion podasz? ");
int size = scanner.nextInt();
scanner.nextLine(); // ignorujemy resztę tej linii, a "kursor przechodzi do następnej"
String[] tablica = new String[size];
for(int i = 0; i < size; i++) {
System.out.print("Podaj imię nr " + i + ": ");
tablica[i] = scanner.nextLine();
}
System.out.println("Wszystkie imiona:");
System.out.println(Arrays.toString(tablica));
// Tablica i wszystkie typy kolekcji pozwalają na używanie pętli "for-each".
for(String imie : tablica) {
System.out.print("; witaj " + imie);
}
System.out.println();
// Najbardziej oczywistym (i wydajnym) sposobem dostepu do elementów tablicy
// jest dostęp po numerze pozycji za pomocą []
// Użytkownik podaje numer, a program odczytuje wartość z podanej pozycji.
// -1 kończy
while(true) {
System.out.print("Podaj nr pozycji: ");
int pozycja = scanner.nextInt();
scanner.nextLine();
if(pozycja == -1) {
break;
}
try {
String imie = tablica[pozycja];
System.out.println("Osoba nr " + pozycja + " to " + imie);
} catch (Exception e) {
System.out.println(e);
}
}
}
}
package p18_zbierz_dane;
import java.util.Arrays;
import java.util.Scanner;
public class P2_TablicaDynamiczna {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Na początku tworzymy tablicę, która ma 4 miejsca,
// ale zanim zaczniemy pobierać imiona, to liczba imion wynosi 0.
String[] tablica = new String[4];
int n = 0;
for(;;) {
System.out.print("Podaj imię nr " + n + ": ");
String imie = scanner.nextLine();
if(imie.isEmpty()) break;
if(n == tablica.length) {
// w tej wersji kopiowanie danych ze starej do nowej tablicy piszemy samodzielnie
System.out.println("powiększanie tablicy");
String[] nowaTablica = new String[2*n];
for(int i=0; i<n; i++) {
nowaTablica[i] = tablica[i];
}
tablica = nowaTablica;
}
tablica[n] = imie;
n++;
}
System.out.println("Wszystkie imiona:");
System.out.println(Arrays.toString(tablica));
for(String imie : tablica) {
System.out.print("; witaj " + imie);
}
System.out.println();
while(true) {
System.out.print("Podaj nr pozycji: ");
int pozycja = scanner.nextInt();
scanner.nextLine();
if(pozycja == -1) {
break;
}
try {
String imie = tablica[pozycja];
System.out.println("Osoba nr " + pozycja + " to " + imie);
} catch (Exception e) {
System.out.println(e);
}
}
}
}
package p18_zbierz_dane;
import java.util.Arrays;
import java.util.Scanner;
public class P2_TablicaDynamiczna_Copy {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Na początku tworzymy tablicę, która ma 4 miejsca,
// ale zanim zaczniemy pobierać imiona, to liczba imion wynosi 0.
String[] tablica = new String[4];
int n = 0;
while(true) {
System.out.print("Podaj imię nr " + n + ": ");
String imie = scanner.nextLine();
if(imie.isEmpty()) break;
if(n == tablica.length) {
// w tej wersji kopiowanie danych wykonujemy za pomocą metody copy
System.out.println("powiększanie tablicy");
tablica = Arrays.copyOf(tablica, 2*n);
}
tablica[n] = imie;
n++;
}
System.out.println("Wszystkie imiona:");
System.out.println(Arrays.toString(tablica));
for(String imie : tablica) {
System.out.print("; witaj " + imie);
}
System.out.println();
while(true) {
System.out.print("Podaj nr pozycji: ");
int pozycja = scanner.nextInt();
scanner.nextLine();
if(pozycja == -1) {
break;
}
try {
String imie = tablica[pozycja];
System.out.println("Osoba nr " + pozycja + " to " + imie);
} catch (Exception e) {
System.out.println(e);
}
}
}
}
package p18_zbierz_dane;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
// Lista:
// - zachowuje kolejność elementów i jest sens mówić o indeksach (numerach pozycji)
// - może zawierać powtórzenia
// - nie wymaga deklarowania z góry liczby elementów; operacja add prawie zawsze potrafi dodać kolejny element na końcu
// - List jest interfejsem; istnieje wiele implementacji listy,
// z czego zdecydowanie najczęściej używaną jest ArrayList
public class P3_Lista {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
List<String> lista = new ArrayList<>();
// Jeśli ma zawierać od razu elementy, to od Javy 9 pisze się tak
// (gdy chcemy mieć listę zdolną do późniejszych modyfikacji)
// List<String> lista = new ArrayList<>(List.of("Ala", "Ela", "Ola"));
// List<String> lista = new ArrayList<>(List.of(tablica));
// a w starszych wersjach:
// List<String> lista = new ArrayList<>(Arrays.toList("Ala", "Ela", "Ola"));
// List<String> lista = new ArrayList<>(Arrays.toList(tablica));
// Takie coś: List<String> lista = List.of("Ala", "Ela", "Ola");
// utworzy listę "niemutowalną", tylko do odczytu.
while(true) {
System.out.print("Podaj kolejne imię: ");
String imie = scanner.nextLine();
if(imie.isEmpty()) break;
lista.add(imie);
// jbc, to tak można wywołać metodę a poziomu AL: ((ArrayList<String>)lista).ensureCapacity(50);
}
System.out.println("Liczba elementów: " + lista.size());
System.out.println("Wszystkie imiona:");
System.out.println(lista);
// Tablica i wszystkie typy kolekcji pozwalają na używanie pętli "for-each".
for(String imie : lista) {
System.out.print("; witaj " + imie);
}
System.out.println();
// Podobnie, jak w przypadku tablic, elementy list także mają ustalony numer pozycji
// od 0 do size-1. Za pomocą get można odczytać element o podanym numerze,
// a set(i, nowa_wartosc) zmienia wartość elementu na nową.
// - ArrayList daje szybki dostęp do elementów o określonym numerze
// - ale ogólnie nie wszystkie listy mają ten dostęp szybki; dla LinkedList operacje get/set działają wolno
while(true) {
System.out.print("Podaj nr pozycji: ");
int pozycja = scanner.nextInt();
scanner.nextLine();
if(pozycja == -1) {
break;
}
try {
String imie = lista.get(pozycja);
System.out.println("Osoba nr " + pozycja + " to " + imie);
} catch (Exception e) {
System.out.println(e);
}
}
}
}
package p18_zbierz_dane;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;
// Zbiór (Set):
// - nie zawiera powtórzeń
// - nie wymaga deklarowania z góry liczby elementów;
// - operacja add w wyniku zwraca true, gdy element został dodany,
// false, gdy element nie został dodany, bo już był
// kończy się wyjątkiem w razie innych problemów
// - Set jest interfejsem; istnieje wiele implementacji zbioru,
// z czego najczęściej używaną jest HashSet
// - HashSet działa w oparciu o metody hashCode i equals
// - zazwyczaj jest najszybszą implementacją (szczególnie dla elementów typu String tak jest)
// - zmienia kolejność elementów
// - LinkedHashSet działa odrobinkę wolniej podczas dodawania, a równie szybko przy odczycie,
// ale za to zachowuje kolejność elementów
public class P4_HashSet {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Set<String> zbior = new HashSet<>();
while(true) {
System.out.print("Podaj kolejne imię: ");
String imie = scanner.nextLine();
if(imie.isEmpty()) break;
zbior.add(imie);
}
System.out.println("Liczba elementów: " + zbior.size());
System.out.println("Wszystkie imiona:");
System.out.println(zbior);
// Tablica i wszystkie typy kolekcji pozwalają na używanie pętli "for-each".
for(String imie : zbior) {
System.out.print("; witaj " + imie);
}
System.out.println();
// Drugi etap: użytkownik podaje imię, a program sprawdza, czy takie imię istnieje
// to jest najbardziej podstawowa operacja dla zbiorów.
// Niezależnie od implementacji ta operacja działa szybko (chociaż dla dużych zbiorów wersje Hash są trochę szybsze niż Tree)
while(true) {
System.out.print("Podaj imię: ");
// pusty string kończy
String imie = scanner.nextLine();
if(imie.isEmpty()) {
break;
}
if(zbior.contains(imie)) {
System.out.println("TAK");
} else {
System.out.println("NIE");
}
}
}
}
package p18_zbierz_dane;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;
// - TreeSet przechowuje elementy w kolejności posortowanej
public class P5_TreeSet {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Set<String> zbior = new TreeSet<>();
// Jeśli ma zawierać od razu elementy, to od Javy 9 pisze się tak:
// Set<String> zbior = new TreeSet<>(Set.of("Ala", "Ela", "Ola"));
while(true) {
System.out.print("Podaj kolejne imię: ");
String imie = scanner.nextLine();
if(imie.isEmpty()) break;
zbior.add(imie);
}
System.out.println("Liczba elementów: " + zbior.size());
System.out.println("Wszystkie imiona:");
System.out.println(zbior);
// Tablica i wszystkie typy kolekcji pozwalają na używanie pętli "for-each".
for(String imie : zbior) {
System.out.print("; witaj " + imie);
}
System.out.println();
// Drugi etap: użytkownik podaje imię, a program sprawdza, czy takie imię istnieje.
// To jest najbardziej podstawowa operacja dla zbiorów.
// Niezależnie od implementacji ta operacja działa szybko (chociaż dla dużych zbiorów wersje Hash są trochę szybsze niż Tree)
while(true) {
System.out.print("Podaj imię: ");
// pusty string kończy
String imie = scanner.nextLine();
if(imie.isEmpty()) {
break;
}
if(zbior.contains(imie)) {
System.out.println("TAK");
} else {
System.out.println("NIE");
}
// to nie Java: if(imie in zbior)
}
}
}
package p18_zbierz_dane;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class P6_Slownik {
// Słownik służy do przechowywania par klucz→wartość
// Przy czym klucze muszą być unikalne. Dostęp po kluczu jest wygodny i wydajny.
// Typ klucza powinien być łatwy do porównania.
// Dobre typy dla klucza: Integer, Long, String, LocalDate
// Podobnie, jak w przypadku zbiorów (Set), dla słowników (Map) mamy takie implementacje,
// które różnią się kolejnością danych:
// - HashMap - kolejność techniczna / chaotyczna
// - LinkedHashMap - kolejność, w jakiej elementy były dodawane po raz pierwszy
// - TreeMap - dane posortowane wg kluczy
// W zaawansowanych zastosowaniach ważną implementacją słowników jest ConcurrentHashMap,
// która poprawnie i wydajnie działa w aplikacjach wielowątkowych (rózne wątki mogą korzytać jednocześnie).
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Dla osoby o podanym imieniu pamiętamy, ile ma lat.
Map<String, Integer> slownik = new HashMap<>();
while(true) {
System.out.print("Podaj kolejne imię: ");
String imie = scanner.nextLine();
if(imie.isEmpty()) break;
System.out.print("Podaj wiek osoby " + imie + ": ");
int wiek = scanner.nextInt();
scanner.nextLine();
slownik.put(imie, wiek);
}
System.out.println("Liczba elementów: " + slownik.size());
System.out.println("Wszystkie imiona:");
System.out.println(slownik);
System.out.println();
// Iteracja po elementach słownika.
// Same klucze:
for(String imie : slownik.keySet()) {
System.out.print("; " + imie);
}
System.out.println();
// Same wartości:
for(Integer wiek : slownik.values()) {
System.out.print(". " + wiek);
}
System.out.println();
System.out.println();
// Klucze wraz z wartościami:
for(Map.Entry<String, Integer> osoba : slownik.entrySet()) {
System.out.println("Osoba " + osoba.getKey() + " ma " + osoba.getValue() + " lat.");
}
System.out.println();
// Od Java 8 można też pisać tak:
slownik.forEach((imie, wiek) -> {
System.out.println(" * " + imie + " → " + wiek);
});
System.out.println();
while(true) {
System.out.print("Podaj imię: ");
// pusty string kończy
String imie = scanner.nextLine();
if(imie.isEmpty()) {
break;
}
if(slownik.containsKey(imie)) {
int wiek = slownik.get(imie);
System.out.println("Osoba " + imie + " ma " + wiek + " lat.");
} else {
System.out.println("Nie znam osoby " + imie);
}
// Podstawową operacją do odczytywania danych ze słownika jest get(klucz).
// Jeśli spróbujemy odczytać element spod nieistniejącego klucza, to wynikiem będzie null.
// Pamiętajmy, by przy takim podejściu zapisywać wynik do zmiennej obiektowej.
// Czyli nie tak: int wiek = slownik.get(imie);
// A raczej tak: Integer wiek = slownik.get(imie);
// if(wiek != null) { ... }
}
}
}
package p18_zbierz_dane;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
public class P7_Queue {
// Kolejka to struktura danych zoptymalizowana pod kątem dostępu do "następnego elementu"
// (operacja poll() lub get()).
// * Kolejka prosta (FIFO) zachowuje kolejność elementów i następnym elementem do pobrania jest ten,
// który został najdawniej w kolejce umieszczony.
// Jak "sprawiedliwa" kolejna do kasy w sklepie.
// Najczęściej jest to jednocześnie kolejka dwukońcowa (Dequeue) z możliwością dostepu do obu jej końców.
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Queue<String> kolejka = new LinkedList<>(); // albo ArrayDequeue; - to są "kolejki proste"
System.out.println(kolejka);
System.out.println("Podawaj kolejne elementy, aby dodać do kolejki.\nWpisz '?', aby pobrać element z kolejki, a Enter aby zakończyć program");
while(true) {
System.out.println("Kolejka: " + kolejka);
System.out.print("> ");
String napis = scanner.nextLine();
if(napis.isEmpty()) break;
if(napis.equals("?")) {
String pobrane = kolejka.poll();
System.out.println("Pobrany element: " + pobrane);
} else {
System.out.println("Dodany element: " + napis);
kolejka.add(napis);
}
}
System.out.println("Końcowy rozmiar kolejki " + kolejka.size());
System.out.println(kolejka);
System.out.println("Koniec programu");
}
}
package p18_zbierz_dane;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;
public class P8_PriorityQueue {
// * Kolejka priorytetowa może nie zachowywać kolejności (możliwe jest tzw. "zagłodzenie").
// Następnym elementem do pobranie jest element o najwyższym priorytecie
// - w Javie jest to element o najmniejszej wartości (np. napis najwcześniejszy alfabetycznie).
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Queue<String> kolejka = new PriorityQueue<>();
System.out.println(kolejka);
System.out.println("Podawaj kolejne elementy, aby dodać do kolejki.\nWpisz '?', aby pobrać element z kolejki, a Enter aby zakończyć program");
while(true) {
System.out.println("Kolejka: " + kolejka);
System.out.print("> ");
String napis = scanner.nextLine();
if(napis.isEmpty()) break;
if(napis.equals("?")) {
String pobrane = kolejka.poll();
System.out.println("Pobrany element: " + pobrane);
} else {
System.out.println("Dodany element: " + napis);
kolejka.add(napis);
}
}
System.out.println("Końcowy rozmiar kolejki " + kolejka.size());
System.out.println(kolejka);
System.out.println("Koniec programu");
}
}
package gotowe.p25_kolekcje.s_sortowanie;
import java.util.Comparator;
public class KomparatorDlugosciNapisow implements Comparator<String> {
public int compare(String s1, String s2) {
/* Jeśli zwracam <0 to znaczy że s1 uważam za mniejsze.
* Jeśli zwracam >0 to znaczy że s1 uważam za większe.
* Jeśli zwracam 0 to znaczy, że są równe.
*/
return s1.length() - s2.length();
}
}
package gotowe.p25_kolekcje.s_sortowanie;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class Sortowanie1 {
public static void main(String[] args) {
String[] imiona = { "Ala", "Ola", "Iwona", "Magdalena", "Joanna", "Anna", "Teresa",
"Żaneta", "Ęcki", "Ącki", "Agnieszka", "ala", "Łucja", "Julia", "Julitta", "Zuzanna" };
List<String> lista = new ArrayList<>(Arrays.asList(imiona));
System.out.println(lista);
// dostępne "od początku" kolekcji w Javie
System.out.println("\nCollections.sort");
Collections.sort(lista);
System.out.println(lista);
// Domyślnie porównywanie Stringów bazuje na kodach Unicode poszczególnych znaków
System.out.println("\nCollections.shuffle");
Collections.shuffle(lista);
System.out.println(lista);
// Od Javy 8 można też tak:
System.out.println("\nlista.sort(null)");
lista.sort(null);
System.out.println(lista);
}
}
package gotowe.p25_kolekcje.s_sortowanie;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Locale;
public class Sortowanie2 {
public static void main(String[] args) {
String[] imiona = { "Ala", "Ola", "Iwona", "Magdalena", "Joanna", "Anna", "Teresa",
"Żaneta", "Ęcki", "Ącki", "ala", "Agnieszka", "Łucja", "Julia", "Julitta", "Ela", "Zuzanna" };
List<String> lista = new ArrayList<>(Arrays.asList(imiona));
System.out.println(lista);
// Pierwszy sposób utworzenia komparatora: oddzielna klasa
System.out.println("\nlista.sort( komparator )");
// Collections.shuffle(lista);
KomparatorDlugosciNapisow komparator = new KomparatorDlugosciNapisow();
lista.sort(komparator);
System.out.println(lista);
System.out.println("\nCollections.sort( lista, komparator )");
Collections.sort(lista, komparator);
System.out.println(lista);
// Drugi sposób utworzenia komparatora: klasa anonimowa
// Składnia dostepna od początków Javy
System.out.println("\nlista.sort( klasa anonimowa )");
lista.sort(new Comparator<String>() {
public int compare(String s1, String s2) {
return s2.length() - s1.length();
}
});
System.out.println(lista);
// Trzeci sposób utworzenia komparatora:
// wyrażenie lambda (od Javy 8)
System.out.println("\nlista.sort( lambda )");
lista.sort((s1, s2) -> s1.length() - s2.length());
System.out.println(lista);
System.out.println("\nCollator");
lista.sort(Collator.getInstance()); // wg bieżących ustawień językowych w systemie
System.out.println(lista);
lista.sort(Collator.getInstance(Locale.CANADA_FRENCH));
System.out.println(lista);
lista.sort(Collator.getInstance(new Locale("pl", "PL")));
System.out.println(lista);
}
}
package gotowe.p25_kolekcje.s_sortowanie;
import java.text.Collator;
import java.util.Arrays;
public class Sortowanie3 {
public static void main(String[] args) {
String[] imiona = { "Ala", "Ola", "Iwona", "Magdalena", "Joanna", "Anna", "Teresa",
"Żaneta", "Ęcki", "Ącki", "Agnieszka", "ala", "Łucja", "Julia", "Julitta", "Zuzanna" };
System.out.println("Sortowanie tablicy");
System.out.println(Arrays.toString(imiona));
Arrays.sort(imiona);
System.out.println(Arrays.toString(imiona));
Arrays.sort(imiona, Collator.getInstance()); // jako Comparator
System.out.println(Arrays.toString(imiona));
Arrays.sort(imiona, (s1, s2) -> s1.length() - s2.length());
System.out.println(Arrays.toString(imiona));
}
}
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