Tworzenie aplikacji w j˛ezyku Java - Piotr Czapiewski

Transkrypt

Tworzenie aplikacji w j˛ezyku Java - Piotr Czapiewski
Tworzenie aplikacji w jezyku
˛
Java
Wykład 2 – Java Collections Framework
Piotr Czapiewski
Wydział Informatyki ZUT
2 października 2009
Piotr Czapiewski (Wydział Informatyki ZUT)
Tworzenie aplikacji w jezyku
˛
Java
2 października 2009
1 / 19
Java Collections Framework
Wprowadzenie
Kolekcja – inaczej kontener
Obiekt grupujacy/przechowuj
˛
acy
˛ elementy (wartości, obiekty)
Przykłady kolekcji: zbiór, lista, wektor, mapa
Składniki Java Collections Framework
Interfejsy
Implementacje (klasy)
Algorytmy
Piotr Czapiewski (Wydział Informatyki ZUT)
Tworzenie aplikacji w jezyku
˛
Java
2 października 2009
2 / 19
Java Collections Framework
Listy
Lista – interfejs java.util.List
Uporzadkowany
˛
zbiór elementów, sekwencja
Zachowana jest kolejność elementów – pełna kontrola nad pozycja˛
elementu na liście, dostep
˛ do elementów wg indeksu
Dopuszczalne duplikaty
W uproszczeniu: lista to tablica o zmiennej długości
Przykład
Przykładowe implementacje
java.util.ArrayList
java.util.LinkedList
java.util.Vector
Piotr Czapiewski (Wydział Informatyki ZUT)
List<String> studenci =
new ArrayList<String>();
studenci.add("Newton");
studenci.add("Einstein");
studenci.add("Doda");
studenci.add("Sokrates");
Tworzenie aplikacji w jezyku
˛
Java
2 października 2009
3 / 19
Java Collections Framework
Listy
Przykład
// jaki jest rozmiar listy?
int n = studenci.size();
// pobierz pierwszy element
String nazwisko = studenci.get(0);
// skreśl z listy studenta o indeksie 2 (liczac
˛ od zera)
studenci.remove(2);
// skreśl Einsteina z listy studentów
studenci.remove("Einstein");
// czy mamy Dod˛
e na liście?
boolean b = studenci.contains("Doda");
Piotr Czapiewski (Wydział Informatyki ZUT)
Tworzenie aplikacji w jezyku
˛
Java
2 października 2009
4 / 19
Java Collections Framework
Listy
Klasa java.util.Collections zawiera pomocnicze metody
statyczne do operowania na kolekcjach (podobnie jak klasa
java.util.Arrays dla tablic).
Przykład
Collections.sort(studenci);
System.out.println(studenci);
// [Doda, Einstein, Newton, Sokrates]
Collections.reverse(studenci);
System.out.println(studenci);
// [Sokrates, Newton, Einstein, Doda]
Collections.shuffle(studenci);
System.out.println(studenci);
// [Sokrates, Einstein, Doda, Newton]
Piotr Czapiewski (Wydział Informatyki ZUT)
Tworzenie aplikacji w jezyku
˛
Java
2 października 2009
5 / 19
Java Collections Framework
Listy
Przykład
List<String> grupa1 = new ArrayList<String>();
List<String> grupa2 = new ArrayList<String>();
// (wypełnij listy danymi....)
// czy grupy przypadkiem nie maja˛ elementów wspólnych?
boolean b = Collections.disjoint(grupa1, grupa2);
// likwidujemy druga˛ grup˛
e, dodaj wszystkich studentów do pierwszej
grupa1.addAll(grupa2);
// oj, dziekan wybrał ulubieńców i utworzył grup˛
e specjalna˛
List<String> grupaS = new ArrayList<String>();
// (wypełnij list˛
e danycmi....)
// Usuwamy z grupy 1 wszystkich studentów, należacych
˛
do grupy S
grupa1.removeAll(grupaS);
Piotr Czapiewski (Wydział Informatyki ZUT)
Tworzenie aplikacji w jezyku
˛
Java
2 października 2009
6 / 19
Java Collections Framework
Zbiory
Zbiór – interfejs java.util.Set
Nie może zawierać powtarzajacych
˛
sie˛ elementów
Przykład
Set<String> studenci =
new HashSet<String>();
Implementacje
HashSet – nie ma
gwarancji zachowania
kolejności; szybkie
dodawanie i usuwanie
TreeSet – elementy sa˛
automatycznie
sortowane
Piotr Czapiewski (Wydział Informatyki ZUT)
studenci.add("Newton");
studenci.add("Einstein");
studenci.add("Doda");
studenci.add("Sokrates");
studenci.add("Doda");
studenci.add("Newton");
System.out.println(studenci);
// [Sokrates, Newton, Doda, Einstein]
Tworzenie aplikacji w jezyku
˛
Java
2 października 2009
7 / 19
Java Collections Framework
Zbiory
Przykład
Set<String> studenci = new HashSet<String>();
studenci.add("Newton");
studenci.add("Doda");
studenci.add("Einstein");
studenci.add("Sokrates");
System.out.println(studenci);
// [Sokrates, Newton, Doda, Einstein]
// zbiór typu TreeSet - z automatycznym sortowaniem
Set<String> studenci2 = new TreeSet<String>();
// dodajmy do nowego zbioru wszystkich studentów
studenci2.addAll(studenci);
System.out.println(studenci2); // [Doda, Einstein, Newton, Sokrates]
Piotr Czapiewski (Wydział Informatyki ZUT)
Tworzenie aplikacji w jezyku
˛
Java
2 października 2009
8 / 19
Java Collections Framework
Iteracja po elementach kolekcji
W przypadku listy iteracje˛ możemy przeprowadzić z licznikiem, jak
dla zwykłej tablicy:
List<String> studenci = new ArrayList<String>();
// ...
for(int i=0; i<studenci.size(); i++) {
String s = studenci.get(i);
System.out.println("Nazwisko: " + s);
}
ale zwykle wygodniej jest tak:
for(String s : studenci) {
System.out.println("Nazwisko: " + s);
}
Piotr Czapiewski (Wydział Informatyki ZUT)
Tworzenie aplikacji w jezyku
˛
Java
2 października 2009
9 / 19
Java Collections Framework
Mapy
Mapa to kolekcja przechowujaca
˛ pary: klucz-wartość
Inaczej: tablica asocjacyjna
Przykład
Map<Integer, String> studenci = new HashMap<Integer, String>();
studenci.put(117, "Kowalski");
studenci.put(235, "Nowak");
studenci.put(487, "Wiśniewski");
System.out.println(studenci);
Wynik:
{117=Kowalski, 235=Nowak, 487=Wiśniewski}
Piotr Czapiewski (Wydział Informatyki ZUT)
Tworzenie aplikacji w jezyku
˛
Java
2 października 2009
10 / 19
Java Collections Framework
Mapy
Pobranie elementu z mapy odbywa sie˛ poprzez podanie klucza
Przykład
Map<Integer, String> studenci = new HashMap<Integer, String>();
studenci.put(117, "Kowalski");
studenci.put(235, "Nowak");
studenci.put(487, "Wiśniewski");
System.out.println(studenci);
String s1 = studenci.get(235);
System.out.println(s1);
// "Nowak"
String s2 = studenci.get(487);
System.out.println(s2);
// "Wiśniewski"
String s3 = studenci.get(666);
System.out.println(s3);
// null
Piotr Czapiewski (Wydział Informatyki ZUT)
Tworzenie aplikacji w jezyku
˛
Java
2 października 2009
11 / 19
Java Collections Framework
Mapy
Iteracja po elementach mapy
keySet - zbiór kluczy
values - lista wartości
entrySet - zbiór elementów (par klucz-wartość)
Przykład
for(int klucz : studenci.keySet()) {
String nazwisko = studenci.get(klucz);
System.out.println(klucz + ": " + nazwisko);
}
Piotr Czapiewski (Wydział Informatyki ZUT)
Tworzenie aplikacji w jezyku
˛
Java
2 października 2009
12 / 19
Java Collections Framework
Mapy
Iteracja po elementach mapy
keySet - zbiór kluczy
values - lista wartości
entrySet - zbiór elementów (par klucz-wartość)
Przykład
for(String s : studenci.values()) {
System.out.println("Nazwisko: " + s);
}
Piotr Czapiewski (Wydział Informatyki ZUT)
Tworzenie aplikacji w jezyku
˛
Java
2 października 2009
13 / 19
Java Collections Framework
Mapy
Iteracja po elementach mapy
keySet - zbiór kluczy
values - lista wartości
entrySet - zbiór elementów (par klucz-wartość)
Przykład
for(Map.Entry<Integer, String> para : studenci.entrySet()) {
int klucz = para.getKey();
String nazwisko = para.getValue();
System.out.println(klucz + ": " + nazwisko);
}
Piotr Czapiewski (Wydział Informatyki ZUT)
Tworzenie aplikacji w jezyku
˛
Java
2 października 2009
14 / 19
Java Collections Framework
Mapy
Przykład
// Czy mamy na liście studenta o numerze 123?
boolean b1 = studenci.containsKey(123);
// Czy mamy na liście studenta o nazwisku Kowalski?
boolean b2 = studenci.containsValue("Kowalski");
// Usuńmy z listy studenta o numerze 117
studenci.remove(117);
// A jak usunać
˛ Kowalskiego?
for(Map.Entry<Integer, String> para : studenci.entrySet()) {
if(para.getValue().equals("Kowalski")) {
studenci.remove(para.getKey());
break;
}
}
Piotr Czapiewski (Wydział Informatyki ZUT)
Tworzenie aplikacji w jezyku
˛
Java
2 października 2009
15 / 19
Java Collections Framework
Przechowywanie złożonych obiektów w kolekcji
class Student {
int nrIndeksu;
String imie, nazwisko, kierunek;
int rokStudiow;
public Student(int nrIndeksu, String imie, String nazwisko,
String kierunek, int rokStudiow) {
this.nrIndeksu = nrIndeksu;
this.imie = imie;
this.nazwisko = nazwisko;
this.kierunek = kierunek;
this.rokStudiow = rokStudiow;
}
public String toString() {
String s = nrIndeksu + ": " + imie + " " + nazwisko +
" (" + kierunek + ", " + rokStudiow + " rok)";
return s;
}
}
Piotr Czapiewski (Wydział Informatyki ZUT)
Tworzenie aplikacji w jezyku
˛
Java
2 października 2009
16 / 19
Java Collections Framework
Przechowywanie złożonych obiektów w kolekcji
class Student {
...
}
...
Map<Integer, Student> m1 = new TreeMap<Integer, Student>();
Student st1 = new Student(732, "Jan", "Kowalski", "Informatyka", 3);
Student st2 = new Student(653, "Tomasz", "Nowak", "Informatyka", 2);
m1.put(st1.nrIndeksu, st1);
m1.put(st2.nrIndeksu, st2);
Student x = m1.get(732);
System.out.println(x);
// Wynik:
// 732: Jan Kowalski (Informatyka, 3 rok)
Piotr Czapiewski (Wydział Informatyki ZUT)
Tworzenie aplikacji w jezyku
˛
Java
2 października 2009
17 / 19
Java Collections Framework
Przechowywanie złożonych obiektów w kolekcji
class Dziennik {
Map<Integer, Student> m1 = new TreeMap<Integer, Student>();
Map<String, Student> m2 = new TreeMap<String, Student>();
public Dziennik() {
}
public void dodajStudenta(Student s) {
m1.put(s.nrIndeksu, s);
m2.put(s.nazwisko, s);
}
public Student znajdzStudenta(int nr) {
return m1.get(nr);
}
public Student znajdzStudenta(String nazwisko) {
return m2.get(nazwisko);
}
}
Piotr Czapiewski (Wydział Informatyki ZUT)
Tworzenie aplikacji w jezyku
˛
Java
2 października 2009
18 / 19
Java Collections Framework
Przechowywanie złożonych obiektów w kolekcji
Dziennik d = new Dziennik();
d.dodajStudenta(st1);
d.dodajStudenta(st2);
Student x1 = d.znajdzStudenta("Kowalski");
Student x2 = d.znajdzStudenta(653);
x1.rokStudiow = 4;
System.out.println(x1);
// 732: Jan Kowalski (Informatyka, 4 rok)
System.out.println(d.znajdzStudenta("Kowalski"));
// 732: Jan Kowalski (Informatyka, 4 rok)
System.out.println(d.znajdzStudenta(732));
// 732: Jan Kowalski (Informatyka, 4 rok)
Piotr Czapiewski (Wydział Informatyki ZUT)
Tworzenie aplikacji w jezyku
˛
Java
2 października 2009
19 / 19