Tworzenie aplikacji w języku Java Wykład 2 Java Collections Framework Piotr Czapiewski Wydział Informatyki ZUT 2 października 2009 Piotr Czapiewski (Wydział Informatyki ZUT) Tworzenie aplikacji w języku Java 2 października 2009 1 / 19
Wprowadzenie Kolekcja inaczej kontener Obiekt grupujacy/przechowuj acy elementy (wartości, obiekty) y kolekcji: zbiór, lista, wektor, mapa Składniki Java Collections Framework Interfejsy Implementacje (klasy) Algorytmy Piotr Czapiewski (Wydział Informatyki ZUT) Tworzenie aplikacji w języku Java 2 października 2009 2 / 19
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, dostęp do elementów wg indeksu Dopuszczalne duplikaty W uproszczeniu: lista to tablica o zmiennej długości owe implementacje java.util.arraylist java.util.linkedlist java.util.vector List<String> studenci = new ArrayList<String>(); studenci.add("newton"); studenci.add("einstein"); studenci.add("doda"); studenci.add("sokrates"); Piotr Czapiewski (Wydział Informatyki ZUT) Tworzenie aplikacji w języku Java 2 października 2009 3 / 19
Listy // jaki jest rozmiar listy? int n = studenci.size(); // pobierz pierwszy element String nazwisko = studenci.get(0); // skreśl z listy studenta o indeksie 2 (licząc od zera) studenci.remove(2); // skreśl Einsteina z listy studentów studenci.remove("einstein"); // czy mamy Dodę na liście? boolean b = studenci.contains("doda"); Piotr Czapiewski (Wydział Informatyki ZUT) Tworzenie aplikacji w języku Java 2 października 2009 4 / 19
Listy Klasa java.util.collections zawiera pomocnicze metody statyczne do operowania na kolekcjach (podobnie jak klasa java.util.arrays dla tablic). Collections.sort(studenci); System.out.println(studenci); Collections.reverse(studenci); System.out.println(studenci); Collections.shuffle(studenci); System.out.println(studenci); // [Doda, Einstein, Newton, Sokrates] // [Sokrates, Newton, Einstein, Doda] // [Sokrates, Einstein, Doda, Newton] Piotr Czapiewski (Wydział Informatyki ZUT) Tworzenie aplikacji w języku Java 2 października 2009 5 / 19
Listy List<String> grupa1 = new ArrayList<String>(); List<String> grupa2 = new ArrayList<String>(); // (wypełnij listy danymi...) // czy grupy przypadkiem nie mają elementów wspólnych? boolean b = Collections.disjoint(grupa1, grupa2); // likwidujemy drugą grupę, dodaj wszystkich studentów do pierwszej grupa1.addall(grupa2); // oj, dziekan wybrał ulubieńców i utworzył grupę specjalną List<String> grupas = new ArrayList<String>(); // (wypełnij listę danycmi...) // Usuwamy z grupy 1 wszystkich studentów, należących do grupy S grupa1.removeall(grupas); Piotr Czapiewski (Wydział Informatyki ZUT) Tworzenie aplikacji w języku Java 2 października 2009 6 / 19
Zbiory Zbiór interfejs java.util.set Nie może zawierać powtarzajacych się elementów Implementacje HashSet nie ma gwarancji zachowania kolejności; szybkie dodawanie i usuwanie TreeSet elementy sa automatycznie sortowane Set<String> studenci = new HashSet<String>(); 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] Piotr Czapiewski (Wydział Informatyki ZUT) Tworzenie aplikacji w języku Java 2 października 2009 7 / 19
Zbiory 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 języku Java 2 października 2009 8 / 19
Iteracja po elementach kolekcji W przypadku listy iterację 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 języku Java 2 października 2009 9 / 19
Mapy Mapa to kolekcja przechowujaca pary: klucz-wartość Inaczej: tablica asocjacyjna 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 języku Java 2 października 2009 10 / 19
Mapy Pobranie elementu z mapy odbywa się poprzez podanie klucza 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); String s2 = studenci.get(487); System.out.println(s2); String s3 = studenci.get(666); System.out.println(s3); // "Nowak" // "Wiśniewski" // null Piotr Czapiewski (Wydział Informatyki ZUT) Tworzenie aplikacji w języku Java 2 października 2009 11 / 19
Mapy Iteracja po elementach mapy keyset - zbiór kluczy values - lista wartości entryset - zbiór elementów (par klucz-wartość) for(int klucz : studenci.keyset()) { String nazwisko = studenci.get(klucz); System.out.println(klucz + ": " + nazwisko); Piotr Czapiewski (Wydział Informatyki ZUT) Tworzenie aplikacji w języku Java 2 października 2009 12 / 19
Mapy Iteracja po elementach mapy keyset - zbiór kluczy values - lista wartości entryset - zbiór elementów (par klucz-wartość) for(string s : studenci.values()) { System.out.println("Nazwisko: " + s); Piotr Czapiewski (Wydział Informatyki ZUT) Tworzenie aplikacji w języku Java 2 października 2009 13 / 19
Mapy Iteracja po elementach mapy keyset - zbiór kluczy values - lista wartości entryset - zbiór elementów (par klucz-wartość) 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 języku Java 2 października 2009 14 / 19
Mapy // 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 usunąć 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 języku Java 2 października 2009 15 / 19
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 języku Java 2 października 2009 16 / 19
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 języku Java 2 października 2009 17 / 19
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 języku Java 2 października 2009 18 / 19
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 języku Java 2 października 2009 19 / 19