Tablice i łańcuchy znakowe jako obiektowe typy danych dr Jarosław Skaruz http://jareks.ii.uph.edu.pl jaroslaw@skaruz.com
O czym będzie? Klasy String, StringBuffer, StringBuilder Tablice jednowymiarowe Tablice wielowymiarowe
Klasa String Pewną zaskakującą może właściwością klasy String jest to, że jej obiekty są niemodyfikowalne - to znaczy utworzonych za pomocą klasy String napisów nie możemy zmieniać (np. do napisu dodać inny). String s = "Ala"; s = s + " ma kota"; Modyfikowalne obiekty-łańcuchy znakowe definiują klasy StringBuffer i StringBuilder. StringBuffer sb = new StringBuffer(); sb.append("jakiś napis 1"); sb.append("jakiś napis 2"); sb.append(10); sb.append('\n'); sb.append (new Para(1,2));
Klasa StringBuffer import javax.swing.*; class Qtimer { private final long start; public QTimer() { System.gc(); start = System.currentTimeMillis(); public long getelapsed() { return System.currentTimeMillis() - start;
Klasa StringBuffer public class Test { public static void main(string args[]) throws InterruptedException { int n = Integer.parseInt(JOptionPane.showInputDialog("Liczba operacji")); // String QTimer t = new QTimer(); String stra = ""; for (int i = 1; i <= n; i++) stra += "A"; long eta = t.getelapsed(); System.out.println("String operator +; Czas: " + eta + " ms"); t = new QTimer(); StringBuffer sb = new StringBuffer(); for (int i = 1; i <= n; i++) sb.append("b"); sb.tostring(); long etb = t.getelapsed(); System.out.println("StringBuffer append. Czas: " + etb + " ms"); System.out.println("Wykonano " + n + " operacji."); System.out.println("Relacja String/StringBuffer = " + (double) eta/etb);
API klasy String charat(int index) compareto(string anotherstring) comparetoignorecase(string str) endswith(string suffix) equals(object anobject) indexof(string str) indexof(string str, int fromindex) lastindexof(string str) lastindexof(string str, int fromindex) length() tolowercase(), touppercase() trim() valueof(boolean b), valueof(char c), valueof(char[] data), valueof(double d)
API klasy String public class Toc { private String doc; private String toc = ""; private final String ls = System.getProperty("line.separator"); public Toc(String doc) { this.doc = doc; public String gettoc() throws IllegalStateException { int p = 0; while ((p = doc.indexof("<h2>", p))!= -1) { int end = doc.indexof("</h2>", p+4); if (end == -1) throw new IllegalStateException("Invalid document structure"); toc += doc.substring(p+4, end) + ls; p = end + 5; return toc;
Klasa StringTokenizer String expr = "21 + 21"; StringTokenizer st = new StringTokenizer(expr); int n = st.counttokens(); // n = 3 String s1 = st.nexttoken(); // napis "21 String s2 = st.nexttoken(); // napis "+ String s3 = st.nexttoken(); // napis "21" while (st.hasmoretokens()) { Sring s = st.nexttoken(); //... tu coś robimy z s String s1 = st.nexttoken(); // napis "21 String s2 = st.nexttoken(); // napis "+ String s3 = st.nexttoken(); // napis "21"
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. W Javie tablice są obiektami, a nazwa tablicy jest nazwą zmiennej, będącej referencją do obiektu-tablicy. Obiekt-tablica zawiera elementy tego samego typu. Może to być dowolny z typów prostych lub referencyjnych. Zatem, w szczególności elementami tablic mogą być referencje do innych tablic. Mamy wtedy do czynienia z odpowiednikiem tablic wielowymiarowych.
Tablice Deklaracja tablicy składa się z: nazwy typu elementów tablicy, pewnej liczby par nawiasów kwadratowych nazwy zmiennej, która identyfikuje tablicę. int[] arr; // jest deklaracją tablicy liczb całkowitych (typu int), String[] s; // jest deklarację tablicy referencji do obiektów klasy String JButton[] b; // jest deklarację tablicy referencji do obiektów klasy JButton double[][] d; // jest deklaracją dwuwymiarowej tablicy liczb rzeczywistych Deklaracja tablicy z inicjacją za pomocą nawiasów klamrowych ma postać: typ[] zm_tab = { wart_1, wart_2,... wart_n typ - typ elementów tablicy, zm_tab - nazwa zmiennej tablicowej, wart_i - wartość i-go elementu tablicy int[] arr = { 1, 2, 7, 21 ;
Tablice Tworzenie tablicy za pomocą wyrażenia new (bez inicjacji elementów) ma postać new T[n]; T - typ elementów tablicy n - rozmiar tablicy (liczba elementów tablicy) int[] arr; // deklaracja tablicy arr = new int[4]; // utworzenie tablicy 4 elementów typu int // lub int[] arr = new int[4];
Odwoływanie się do elementów tablic Indeksy tablicy mogą być wyłącznie wartościami typu int. Mogą być dowolnymi wyrażeniami, których wyliczenie daje wartość typu int. Tablice zawsze indeksowane są poczynając od 0. Pierwszy element n-elementowej tablicy ma indeks 0, a ostatni - indeks n-1. public class Test { public static void main(string[] args) { int[] a = {1, 2, 3, 4 ; System.out.println(a[4]); System.out.println(a[3]); System.out.println(a[2]); System.out.println(a[1]); public class Test { public static void main(string[] args) { int[] a = {1, 2, 3, 4 ; for (int i=3; i>=0; i--) System.out.println(a[i]);
Tablice jako wyniki i argumenty metod Ponieważ zmienna oznaczająca tablicę zawiera referencje do tablicy, to - pod pewnymi warunkami - możemy jej przypisać referencję do innej tablicy. Zmiennej tablicowej typu typa[] można przypisać wartość zmiennej tablicowej typu typb[] pod warunkiem, że dopuszczalne jest przypisanie wartości typu B zmiennej typu A. Każdej zmiennej tablicowej - jak każdej zmiennej zawierającej referencję - można przypisać wartość null W bardzo naturalny sposób możemy przypisywać referencje w przypadku gdy mamy do czynienia z tym samym typem tablic (a zatem - z tym samym typem elementów oraz z tą samą liczbą wymiarów). Tak samo jak w przypadku innych obiektów - nie należy mylić przypisania zmiennych tablicowych (czyli referencji) z kopiowaniem zawartości tablic.
Tablice jako wyniki i argumenty metod public class Test { public static void main(string[] args) { byte[] b1 = {1, 2, 3 ; byte[] b2 = {1, 2, 3, 5, 5 ; byte[] b = b2; b2 = b1; b2[0] = 77; b[0] = 99; System.out.print("\nTablica \"b1\":"); for (int i=0; i < b1.length; i++) System.out.print(" " + b1[i]); System.out.print("\nTablica \"b2\":"); for (int i=0; i < b2.length; i++) System.out.print(" " + b2[i]); System.out.print("\nTablica \"b\":"); for (int i=0; i < b.length; i++) System.out.print(" " + b[i]);
Tablice jako wyniki i argumenty metod public class Test { Test() { int[] a = {1, 2, 3, 4 ; int[] wynik = dblval(a); for (int i=0; i < wynik.length; i++) System.out.print(" " + wynik[i]); int[] dblval(int[] tab) { int[] w = new int[tab.length]; for (int i=0; i < w.length; i++) w[i] = tab[i]*2; return w; public static void main(string[] args) { new Test();
Tablice jako wyniki i argumenty metod
Tablice jako wyniki i argumenty metod public class Test3 { public static void main(string[] args) { new Test3(); Test3() { int[] tab = { 2, 5, 7 ; chgtab1(tab); showtab("po wywołaniu metody chgtab1 tablica oznaczana przez tab", tab); chgtab2(tab); showtab("po wywołaniu metody chgtab2 tablica oznaczana przez tab", tab); void chgtab1(int[] tab) { int[] nowa = { 3, 6, 8 ; tab = nowa; showtab("w metodzie chgtab1 tablica oznaczana przez tab", tab); void chgtab2(int[] tab) { for (int i=0; i < tab.length; i++) tab[i]++; void showtab(string s, int[] tab) { System.out.println(s); for (int i=0; i < tab.length; i++) System.out.print(" " + tab[i]); System.out.print('\n');
Rozszerzona instrukcja FOR dla tablic Składnia gdzie: for ( Typ id : expr ) stmt expr - wyrażenie, którego typem jest (m.in.) typ tablicowy, Typ - nazwa typu elementów zestawu danych (np. int albo String) id - identyfikator zmiennej, na którą będzie podstawiany kolejny element zestawu danych; do tej zmiennej mamy dostęp w stmt (czyli instrukcji wykonywanej w każdym kroku for). double[] nums = { 1, 2, 3 ; for (double d : nums) System.out.println(d + 1); String[] names = { "A", "B", "C" for (String s : names) System.out.println(s);
Argumenty wiersza poleceń public class Program { //... public static void main(string[] args) { //... java Program arg1 arg2 public class Test { public static void main(string[] args) { if (args.length!= 2) syntax(); System.out.println(args[0] + " " + args[1]); static void syntax() { System.out.println("Syntax:... "); System.exit(1);
Tablice obiektowe String[] town = { "Warszawa", "Poznań", "Kraków", "Gdańsk" ; for (int i=0; i<town.length; i++) System.out.println(town[i]); przestawienie miejscami pierwszy i ostatni element: String last = town[town.length -1]; town[town.length -1] = town[0]; town[0] = last; public class TabPar { public static void main(string[] args) { Para[] tabpar = new Para[10]; for (int i=0; i < tabpar.length; i++) tabpar[i].show("para " + (i+1));
Tablice obiektowe public class TabPar { public static void main(string[] args) { Para[] tabpar = new Para[10]; for (int i=0; i < tabpar.length; i++) tabpar[i] = new Para(i+1, i+2); for (int i=0; i < tabpar.length; i++) tabpar[i].show("para " + (i+1)); Para 1 ( 1, 2 ) Para 2 ( 2, 3 ) Para 3 ( 3, 4 ) Para 4 ( 4, 5 ) Para 5 ( 5, 6 ) Para 6 ( 6, 7 ) Para 7 ( 7, 8 ) Para 8 ( 8, 9 ) Para 9 ( 9, 10 ) Para 10 ( 10, 11 )
Tablice wielowymiarowe Tablice wielowymiarowe w Javie realizowane są jako tablice elementów, będących referencjami do tablic. Przykładowe sposoby deklaracji i inicjacji: a. inicjacja w nawiasach klamrowych int[][] mac1 = { { 1, 2, 3,, { 4, 5, 6, ; b. dynamicznie int[][] mac2 = new int[n][m];
Tak, to już KONIEC Dziękuję za uwagę!