1 Kolekcje i tablice © Krzysztof Barteczko, PJWSTK 2009.

Slides:



Advertisements
Podobne prezentacje
Wstęp do strumieni danych
Advertisements

C++ wykład 4 ( ) Przeciążanie operatorów.
Standardowa biblioteka języka C++
Wzorce.
Sposoby implementacji asocjacji
Implementacja ekstensji klasy
Nguyen Hung Son Uniwersytet Warszawski
Programowanie obiektowe w Javie
Podstawy języka Java Nguyen Hung Son Uniwersytet Warszawski.
Marcin Pamuła Mateusz Stefek
Współprogramy III Ten wykład ma na celu pokazanie kolejnej ciekawej możliwości, którą oferują współprogramy. Wspólprogramy reprezentujące wyrażenia regularne.
Uzupełnienie W OS zmienne indeksowane są utożsamiane ze zwykłymi, więc przykład z MonitoredArray trzeba by przerobić przeliczając indeksy o 1.
Inżynieria oprogramowania Lecture XXX JavaTM – część IV: IO
Kurs Pascala – spis treści
Java – technologie zaawansowane Wykład 8 (9 maja 2011)
Tablice jednowymiarowe 1
Tablice tablica jest sekwencją elementów tego samego typu (prostego lub obiektowego) w Javie tablice są obiektami, a zmienne tablicowe przechowują referencję
Projektowanie warstwy serwera DisplayTag. Projektowanie warstwy serwera Projekt współfinansowany przez Unię Europejską w ramach Europejskiego Funduszu.
Hibernate relacje.
FP-Growth Adam Pieśkiewicz Kamil Niezręcki Krzysztof Grześkowiak
Techniki i języki programowania
Podstawy C# Grupa .NET PO.
Podstawy programowania II
Java 3 MPDI Programowanie obiektowe W7. import java.io.*; public class X { // kontrukcja throws – określenie jakie wyjątki może dana metoda // sygnalizować
Programowanie obiektowe III rok EiT
JAVA c.d.. Instrukcji wyboru SWITCH używamy, jeśli chcemy w zależności od wartości pewnego wyrażenia wykonać jeden z kilku fragmentów kodu. Jest to w.
Java – coś na temat Klas Piotr Rosik
Inicjalizacja i sprzątanie
Systemy wejścia i wyjścia Michał Wrona. Co to jest system wejścia i wyjścia? Pobierania informacji ze źródeł danych, zdolnych przesyłać sekwencje bajtów,
Zbiory i rekordy mgr inż. Agata Pacek. Deklaracja typu zbiorowego (określa ilość elementów w zbiorze) type biegi=set of 0..6; Definiowanie zmiennej typu.
C# Platforma .NET CZ.3 Kuba Ostrowski.
Tworzenie Aplikacji Internetowych dr Wojciech M. Gańcza 8.
Programowanie obiektowe 2013/2014
Wykład 10 typ zbiorowy rekurencja.
1 Strumienie Hierarchie klas strumieniowych, strumienie bajtowe - klasy InputStream i OutputStream i ich metody, klasa File, strumienie plikowe, strumienie.
  ELEMENTY JĘZYKA JAVA komentarze w Javie, słowa kluczowe i operatory, proste typy danych, tablice, podstawowy zestaw instrukcji.
BJUG_1: Typy Generyczne, Kolekcje
Treści multimedialne - kodowanie, przetwarzanie, prezentacja Odtwarzanie treści multimedialnych Andrzej Majkowski informatyka +
Wydział Elektroniki Kierunek: AiR Zaawansowane metody programowania Wykład 5.
Kurs języka C++ – wykład 4 ( )
Klasy kolekcji Tomasz Wilczyński. Kolekcja Schemat kolekcji Javy zawiera sześć interfejsów oraz kilka innych implementacji tych interfejsów do celów ogólnych.
Mapa STL – C++. Problem polega na tym, że najczęściej chcielibyśmy przechowywać w zbiorze elementy jakiegoś bardziej złożonego typu, których on nie będzie.
Kolekcje (3) Zbiory. Porównywanie i porządkowanie elementów kolekcji. (c) Krzysztof Barteczko 2014.
Kolekcje (4) Mapy Widoki i algorytmy (c) Krzysztof Barteczko 2014.
Elementy programowania funkcyjnego w Javie 8. Pragmatyczny przegląd. (c) Krzysztof Barteczko 2014.
© Krzysztof Barteczko, PJWSTK 2012
Typy i metody sparametryzowane (generics) (c) Krzysztof Barteczko 2014.
do programowania obiektowego w języku Groovy
1 Kolekcje © Krzysztof Barteczko, PJWSTK Pojęcie kolekcji Kolekcja jest obiektem, który grupuje elementy danych (inne obiekty) i pozwala traktować.
1 Pliki i katalogi K. Barteczko Pojęcie pliku Plik - to ciąg bajtów zapisanych na dysku lub w innej fizycznie trwałej formie. po co są pliki.
Asocjacja,Kompozycja,Agregacja
Groovy: funkcje i domknięcia
Implementacja asocjacji (z atrybutami i bez) przy użyciu: referencji (kolekcji referencji) tablic asocjacyjnych przygotował: Kamil Kowalczyk.
K URS JĘZYKA C++ – WYKŁAD 3 ( ) Przenoszenie Składowe statyczne Funkcje wbudowane Argumenty domyślne.
W pełni obiektowyInterpretowany i kompilowany Kompilowany do JVM Bytecode Umożliwia korzystanie z bibliotek Java Skonstruowany z myślą o wysokiej produktywności.
InMoST, Java – przykładowa aplikacja Bartosz.Michalik
Wprowadzenie do języka Java Kolekcje w języku Java Bartosz Walter.
Lua - wprowadzenie ● lua.org – źródła, dokumentacja, podręcznik itp ● Interpreter - Lua.org->Downloads->Binaries->get a binary-> Windows->Wersja >Executables->
Typy wyliczeniowe, kolekcje
Listy.
(według:
(c) Krzysztof Barteczko 2014
Programowanie obiektowe II
Programowanie Obiektowe – Wykład 2
Klasy wewnętrzne. Praktyka użycia interfejsów i klas wewnętrznych
PGO Interfejsy Michail Mokkas.
PGO Kolekcje Michail Mokkas.
PGO Porównywanie obiektów
Projekt Zespołowy w Javie
Zapis prezentacji:

1 Kolekcje i tablice © Krzysztof Barteczko, PJWSTK 2009

2 Pojęcie kolekcji Kolekcja jest obiektem, który grupuje elementy danych (inne obiekty) i pozwala traktować je jak jeden zestaw danych, umożliwiając jednocześnie wykonywanie operacji na zestawie danych np. dodawania i usuwania oraz przeglądania elementów zestawu. Mamy do dyspozycji m.in. następujące rodzaje zestawów danych: listy (elementy mają pozycje i mogą się powtarzać) zbiory (elementy nie mają pozycji i nie mogą się powtarzać) mapy (zestaw odwzorowań klucz -> wartość) Abstrakcyjne (niezależne od sposobu realizacji) właściwości tych struktur danych opisywane są przez interfejsy, a ich konkretne realizacje przez implementacje interfejsów w klasach. Java Collections Framework: interfejsy, implementacje (klasy), algorytmy

3 Przypomnienie Interfejsy - "biedniejsze klasy" = deklaracje metod. Klasy mogą implementować interfejsy. interface Runnable { run() } class Dog implements Runnable { def run() { // definicja metody run dla Psa // jak biegnie pies? } class Cat implements Runnable { def run() { // definicja metody run dla kota // jak biegnie kot? }

4 Podstawowe interfejsy i klasy kolekcyjne

5 Listy i zbiory def list = [] // ArrayList by default def set1 = new HashSet() // unsorted set def set2 = new TreeSet() // sorted set def file = new File('firms.txt') file.eachLine { list << it set1 << it set2 << it } println list println set1 println set2 Output: [IBM, Sun, Oracle, Sun, Apple] [Sun, Apple, Oracle, IBM ] [Apple, IBM, Oracle, Sun] Łatwość: - dynamiczne tablice - usuwanie duplikatów - sortowanie

6 Listy i zbiory = Collection Najprostsze ogólne operacje na kolekcjach: Metoda Groovy operator size() isEmpty() ref in (cond) np. if (coll)... add(Object) << += remove(Object) - clear() contains(Object) *n duplicate n times

7 Iterator Indeksowanie? list[7] // ok set[7] // NIE Iterator jest obiektem klasy implementującej interfejs Iterator i służy do przeglądania elementów kolekcji oraz ew. usuwania ich przy przeglądaniu Od każdej kolekcji możemy uzyskac iterator: Iterator iter = c.iterator() gdzie: c - dowolna klasa implementująca interfejs Collection. Metody: hasNext() - czy jest następny element next() - daj następny element remove() - usuń element zwrócony przez ostatnie next

8 Iterator - przykład def set = [1, 2, 8, 8, 17, 9] as Set println set def iter = set.iterator() while (iter.hasNext()) { elt = iter.next() println elt if (elt < 7) iter.remove() } println set Output: [17, 1, 2, 8, 9] [17, 8, 9]

9 "Concurrent modification" niedozwolone W trakcie iteracji za pomocą iteratora nie wolno modyfikować kolekcji innymi sposobami niż użycie metody remove() na rzecz iteratora. Niech c - dowolna kolekcja Iterator it1 = c.iterator() while (it1.hasNext()) { it1.next() l.add('x') // Błąd fazy wykonania } Iterator it1 = c.iterator(); Iterator it2 = c.iterator(); while (it1.hasNext()) { it1.next(); it2.next(); it2.remove(); // Błąd fazy wykonania } ConcurrentModificationException

10 Iterowanie po dowolnych kolekcjach Znane nam formy: for (var in col) ins for (Typ var : col) ins col.each { closure } Przykład: def set = new HashSet() def list = [] for (e in ['a','b','c', 'c']) set << e set.each { list << it + 1 } println set println list Output: [b, c, a] [b1, c1, a1] Pod spodem są iteratory więc w kodzie nie można strukturalnie modyfikować kolekcji. list.each { if (it[0] == 'a') list.remove(it) } ConcurrentModificationException

11 Metoda collect List list = coll.collect { closure } Iterates through this collection transforming each entry into a new value using the closure as a transformer, returning a list of transformed values. def defaultBonus = 100 def f = new File('bonus.txt') println f.text def bonus = f.readLines().collect { if (it.tokenize().size() < 2) "$it $defaultBonus" else it } println 'Default bonus assigned' bonus.each { println it } Output: John 700 Steve Kate 500 Adam Default bonus assigned John 700 Steve 100 Kate 500 Adam 100

12 Przeszukiwanie kolekcji M.in. metody: Collection findAll(Closure closure) Finds all values matching the closure condition. Collection grep(Object filter) Iterates over every element of the collection and returns each item that matches the given filter (filter as in 'case' label of 'switch' statement) Inne metody: find { Closure } // zwraca pierwszy element spełniający warunek boolean any { Closure } // czy jest elt spełniający warunek boolean every { Closure } // czy wszystkie spełniają warunek

13 Przykład def allFiles = [] def dir = new File('..') dir.eachFileRecurse { if (it.isFile()) allFiles << it } def groovyFiles = allFiles.findAll { it.name.endsWith('.groovy') } def smallFiles = allFiles.grep( { it.size() < 1000 } ) def smallFileNames = smallFiles.collect { it.name } def txtFileNames = smallFileNames.grep( ~/.+\.txt/) println 'Files in dirs of ' + dir.canonicalPath println 'Is there any smaller than 100 ' + allFiles.any { it.size() < 100 } println 'Is every file older than now ' + allFiles.every { it.lastModified() < new Date().time } println 'All: ' + allFiles.size() println 'Small: ' + smallFiles.size() println 'Groovy: ' + groovyFiles.size() println 'Small text files: ' + txtFileNames.size() Output (could be): Files in dirs of E:\PJWSTK\InfSpol\Wyklady\IspWprWsp Is there any smaller than 100 true Is every file older than now true All: 1121 Small: 880 Groovy: 89 Small text files: 27

14 Metoda inject Z dokumentacji GDK: Object inject(Object value, Closure closure) Iterates through the given object, passing in the initial value to the closure along with the current iterated item then passing into the next iteration the value of the previous closure. def taskNr = 2 def name = "Kowalski Jan Maria" def nameWords = name.tokenize(' ') def proj = nameWords.inject("Task$taskNr") { p, elt -> p +=elt[0] } println proj Output: Task2KJM

15 Sumowanie Object sum() Sums the items in a collection. Objectsum(Object initialValue) Sums the items in a collection, adding the result to some initial value. Objectsum(Closure closure) Sums the result of apply a closure to each item of a collection. Object sum(Object initialValue, Closure closure) Sums the result of apply a closure to each item of a collection to sum intial value. s1 =[1, 5, 7].sum() s2 = [1, 5, 7].sum(10) s3 = new File('bonus.txt').readLines().sum { it.size() } println "$s1 $s2 $s3" Output: Z dokumentacji GDK

16 Operator spread i spread-dot Spread === a(*list) a(list[0], list[1],...) Spread-dot === list*.a() [list[0].a(), list[1].a()...] import static javax.swing.JOptionPane.*; def inp = showInputDialog('Enter 3 numbers') println inp if (inp) { def list = inp.tokenize() println list.sum() def nums = list*.toInteger() println nums.sum() println oper(*nums) } def oper (a, b, c) { return a * (b + c) } Output:

17 Tablice Tablice są zestawami elementów (wartości) tego samego typu, ułożonych na określonych pozycjach. Do każdego z tych elementów mamy bezpośredni ( swobodny - nie wymagający przeglądania innych elementów zestawu) dostęp poprzez nazwę tablicy i pozycję elementu w zestawie, określaną przez indeks lub indeksy tablicy. Różnica pomiędzy tablicami a prostymi listami: > rozmiar tablicy niezmienny (po utworzeniu), > rozmiar listy może się zmieniać (dodawanie i usuwanie elementów) Tablice - po co ? efektywność wiele metod z klas Javy zwraca tablice, lub wymaga arg. tablic niemodyfikowalna (co do rozmiaru) lista

18 Definiowanie i tworzenie tablic Tworzenie tablicy: new T[n] gdzie: * T - typ elementów tablicy * n - rozmiar tablicy (liczba elementów tablicy) Np. arr = new BigDecimal[5] def arr1 //... arr1 = new Integer[3] // można też użyć typu int // n jest typu Integer i ma wartość (np. wprowadzoną) def arr2 = new String[n] int[] a1 a1 = new int[10] String[] stab = new String[n] Tablica jest obiektem typu T[], tu: int[] i String[]

19 Dostęp do elementów tablic indeksy - liczby całkowite typu int od 0 liczba elementów w tablicy: n = arr.length // Groovy i Java n = arr.size() // Groovy dostęp do elementów: arr[0], arr[1],..., arr[n-1] np.: def arr = new int[3] arr[0] = 1 arr[1] = 2 arr[2] = 3 s = arr[1] + arr[2] arr[0] = arr[0] * 2

20 Tablice a proste listy - przykład def arr = new String[2] arr[0] = 'a' arr[1] = 'b' //arr << 'c' błąd - operator << nie dla tablic //arr[2]='c' ArrayIndexOutOfBoundsException println arr.class.name + ' ' + arr println 'First: ' + arr[0] println 'Last: ' + arr[arr.length-1] println 'Last: ' + arr[arr.size()-1] println 'Last: ' + arr[-1] def list = [] list[0] = 'a' list[1] = 'b' list[2] = 'c' println list.class.name + ' ' + list println 'First: ' + list[0] println 'Last: ' + list[list.size()-1] //println 'Last: ' + list[list.length-1] błąd length nie dla list println 'Last: ' + list[-1] println list list << 'c' println list Output: [Ljava.lang.String; [a, b] First: a Last: b java.util.ArrayList [a, b, c] First: a Last: c [a, b, c] [a, b, c, c]

21 Konwersje lista tablica Tablice można przekształcać w listy i vice versa: arr = [1, 2, 3] as Integer[] // można też as int[] list = [ 'a', 'b', 'c' ] arr = list as String[] // można też: arr = (String[]) list list = arr as List // ten sam efekt co arr as ArrayList list = arr.toList() // j.w.

22 Tablice i listy - identyczne operowanie Większość omówionych sposobów dostępu, iterowanie, przeszukiwania itp. może być używana jednolicie dla tablic i list. def list = [1, 7, 15, 22 ] def arr = [1, 2, 11, 17] as int[] println list.class.name + ' ' + arr.class.name sameSyntax list sameSyntax arr def sameSyntax(obj) { obj.each { print it + ' ' } println() println obj.findAll { it > 10 } println obj.inject(0) { sum, elt -> sum += elt } } Output: java.util.ArrayList [I [15, 22] [11, 17] 31