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