SlideShare une entreprise Scribd logo
1  sur  22
Télécharger pour lire hors ligne
Java. Rozmówki
                           Autor: Timothy R. Fisher
                           T³umaczenie: Przemys³aw Szeremiota
                           ISBN: 978-83-246-0949-9
                           Tytu³ orygina³u: Java Phrasebook
                           Format: B6, stron: 272




                                   Zwiêz³y przewodnik opisuj¹cy najczêœciej u¿ywane instrukcje jêzyka Java
                                • Naucz siê kompilowaæ i uruchamiaæ programy w Javie
                                • Poznaj najpopularniejsze polecenia tego jêzyka
                                • Pisz programy dzia³aj¹ce na wielu platformach
                           Ju¿ od wielu lat Java jest jednym z najpopularniejszych jêzyków programowania,
                           a znaj¹cy j¹ programiœci s¹ poszukiwani i cenieni na rynku pracy. Jej atrakcyjnoœæ
                           wynika g³ównie z tego, ¿e kod napisany w tym jêzyku mo¿na uruchamiaæ na wielu
                           platformach, w³¹czaj¹c w to ró¿ne systemy operacyjne, a tak¿e urz¹dzenia przenoœne,
                           na przyk³ad telefony komórkowe. Prosty jest tak¿e dostêp do wielu narzêdzi oraz
                           bezp³atnych bibliotek u³atwiaj¹cych programowanie w Javie. Ponadto jêzyk ten otwiera
                           wielkie mo¿liwoœci w zakresie tworzenia aplikacji sieciowych.
                           „Java. Rozmówki” przedstawia skuteczne rozwi¹zania najczêœciej wystêpuj¹cych
                           problemów i pomo¿e Ci b³yskawicznie rozpocz¹æ programowanie w tym jêzyku.
                           Dowiesz siê, jak kompilowaæ i uruchamiaæ programy w Javie. Nauczysz siê manipulowaæ
                           ci¹gami, strukturami danych i datami oraz stosowaæ wyra¿enia regularne. Poznasz
                           operacje wejœcia i wyjœcia, a tak¿e sposoby pracy z katalogami i plikami. Przeczytasz
                           o aplikacjach sieciowych dzia³aj¹cych zarówno po stronie klienta, jak i po stronie serwera.
                           Opanujesz efektywne techniki pracy z bazami danych i korzystanie z formatu XML.
                                • Kompilowanie i uruchamianie programów w Javie
                                • Wspó³praca ze œrodowiskiem
                                • Obs³uga ci¹gów i liczb
                                • Korzystanie ze struktur danych
                                • Operacje wejœcia i wyjœcia
                                • Manipulowanie plikami i katalogami
                                • Praca z klientami i serwerami sieciowymi
Wydawnictwo Helion              • Komunikacja z bazami danych i u¿ywanie XML
ul. Koœciuszki 1c               • Programowanie wielow¹tkowe
44-100 Gliwice                                Dziêki treœciwym rozmówkom b³yskawicznie poznasz
tel. 032 230 98 63                                praktyczne podstawy programowania w Javie
e-mail: helion@helion.pl
O autorze ......................................................................... 11

    Wprowadzenie ................................................................ 13

1   Podstawy ......................................................................... 17
    Kompilowanie programu w Javie ......................................... 19
    Uruchamianie programu w Javie .......................................... 21
    Ustawianie zmiennej CLASSPATH ......................................... 22

2   Interakcje z otoczeniem ................................................... 25
    Odczytywanie zmiennych środowiskowych .......................... 26
    Odczytywanie i ustawianie właściwości systemowych .......... 27
    Przetwarzanie argumentów wywołania programu ............... 28

3   Manipulowanie ciągami .................................................. 31
    Porównywanie ciągów ......................................................... 32
    Wyszukiwanie i wyłuskiwanie podciągów ............................ 35
    Przetwarzanie ciągu znak po znaku ...................................... 37
    Odwracanie znaków w ciągu ............................................... 38
    Odwracanie wyrazów w ciągu ............................................. 38
Spis treści


        Zamiana wszystkich liter w ciągu na wielkie albo na małe ....... 40
        Usuwanie zbędnych spacji z początku i końca ciągu ............. 41
        Przetwarzanie ciągu wyrazów oddzielanych przecinkami ...... 42

    4   Praca ze strukturami danych ............................................47
        Zmiana rozmiaru tablicy ....................................................... 48
        Przeglądanie kolekcji ............................................................ 49
        Tworzenie odwzorowania .................................................... 51
        Porządkowanie kolekcji ........................................................ 53
        Wyszukiwanie obiektu w kolekcji ......................................... 55
        Konwersja kolekcji na tablicę ................................................ 58

    5   Daty i godziny ..................................................................59
        Określanie bieżącej daty ....................................................... 60
        Konwersja pomiędzy klasami Date i Calendar ....................... 61
        Wyświetlanie daty (godziny) w zadanym formacie ............... 62
        Wyodrębnianie dat z ciągów znaków ................................... 65
        Dodawanie i odejmowanie obiektów Date bądź Calendar .... 67
        Obliczanie różnicy pomiędzy dwiema datami ....................... 68
        Porównywanie dat ............................................................... 69
        Określanie numeru dnia w tygodniu, miesiąca
         w roku albo tygodnia w roku ............................................. 71
        Obliczanie czasu trwania operacji ......................................... 72

    6   Dopasowywanie wzorców za pomocą
         wyrażeń regularnych .....................................................75
        Wyrażenia regularne w Javie ................................................ 76
        Wyszukiwanie i dopasowywanie tekstu
         za pomocą wyrażenia regularnego ..................................... 79
        Zastępowanie dopasowanego tekstu ................................... 82
        Wyszukiwanie wszystkich wystąpień wzorca ........................ 84
        Wypisywanie wierszy zawierających wzorzec ....................... 85
        Dopasowywanie znaków nowego wiersza ........................... 86
4
Spis treści


7   Liczby ............................................................................... 89
    Sprawdzanie, czy ciąg zawiera poprawną liczbę ................... 90
    Porównywanie liczb zmiennoprzecinkowych ........................ 91
    Zaokrąglanie liczb zmiennoprzecinkowych ........................... 93
    Formatowanie liczb .............................................................. 94
    Formatowanie wartości monetarnych ................................... 97
    Konwersja dziesiętnej liczby całkowitej na zapis
     dwójkowy, ósemkowy bądź szesnastkowy ......................... 98
    Generowanie liczb losowych ................................................ 98
    Funkcje trygonometryczne .................................................. 100
    Obliczanie logarytmów ...................................................... 100

8   Wejście i wyjście ........................................................... 103
    Odczytywanie tekstu ze standardowego
     wejścia programu ............................................................ 104
    Wypisywanie do standardowego wyjścia ........................... 105
    Formatowanie wyjścia ....................................................... 106
    Otwieranie pliku identyfikowanego przez nazwę ................ 112
    Wczytanie zawartości pliku do tablicy bajtów .................... 112
    Wczytywanie danych binarnych ......................................... 113
    Przesuwanie pozycji w pliku ............................................... 114
    Odczytywanie archiwum JAR albo ZIP ................................ 115
    Tworzenie archiwum ZIP .................................................... 116

9   Praca z katalogami i plikami .......................................... 119
    Tworzenie pliku ................................................................. 120
    Zmiana nazwy pliku lub katalogu ....................................... 122
    Usuwanie pliku albo katalogu ............................................ 123
    Zmiana atrybutów pliku ..................................................... 124
    Ustalanie rozmiaru pliku .................................................... 125
    Sprawdzanie obecności pliku lub katalogu ......................... 126

                                                                                                5
Spis treści


         Przenoszenie pliku lub katalogu ......................................... 127
         Ustalanie bezwzględnej ścieżki dostępu
          na podstawie ścieżki względnej ....................................... 128
         Ustalanie, czy ścieżka dostępu określa plik, czy katalog ...... 129
         Wypisywanie zawartości katalogu ...................................... 131
         Tworzenie nowego katalogu .............................................. 135

    10 Klienty sieciowe .............................................................137
       Nawiązywanie połączenia z serwerem ............................... 138
       Ustalanie adresów IP i nazw domenowych ......................... 139
       Obsługa błędów sieciowych ............................................... 140
       Wczytywanie danych (tekstu) z gniazda .............................. 142
       Zapisywanie do gniazda ..................................................... 143
       Wczytywanie danych binarnych ......................................... 144
       Zapisywanie danych binarnych ........................................... 146
       Wczytywanie danych serializowanych ................................ 148
       Zapis serializowanego obiektu ........................................... 149
       Pobieranie strony WWW przez HTTP .................................. 151

    11 Serwery sieciowe ...........................................................155
       Uruchamianie serwera i przyjmowanie żądań ..................... 156
       Zwracanie odpowiedzi ....................................................... 157
       Odsyłanie obiektu .............................................................. 159
       Obsługa wielu klientów ...................................................... 161
       Udostępnianie treści przez HTTP ......................................... 163

    12 Wysyłanie i odbieranie poczty elektronicznej ................167
       Przegląd JavaMail API ........................................................ 168
       Wysyłanie poczty ............................................................... 169
       Wysyłanie wiadomości MIME ............................................. 172
       Odbieranie poczty .............................................................. 175


6
Spis treści


13 Dostęp do baz danych ................................................... 179
   Nawiązywanie połączenia z bazą danych przez JDBC ......... 180
   Wysyłanie zapytania przez JDBC ........................................ 183
   Stosowanie zapytań sparametryzowanych ......................... 185
   Pobieranie wyników zapytania ........................................... 187
   Uruchamianie procedury składowanej ................................ 189

14 XML w Javie .................................................................. 193
   Analiza XML za pomocą SAX .............................................. 195
   Analiza XML za pomocą DOM ............................................ 198
   Weryfikowanie poprawności dokumentu względem DTD ... 201
   Tworzenie dokumentu XML za pomocą DOM ..................... 203
   Przekształcanie XML za pomocą XSLT ................................. 206

15 Stosowanie wątków ...................................................... 209
   Uruchamianie wątku .......................................................... 210
   Zatrzymywanie wątku ........................................................ 213
   Oczekiwanie zakończenia wątku ........................................... 214
   Synchronizowanie wątków ................................................ 216
   Wstrzymywanie wątku ....................................................... 220
   Wypisywanie listy wątków ................................................. 222

16 Programowanie dynamiczne z introspekcją .................. 225
   Ustalanie klasy obiektu ...................................................... 227
   Ustalanie nazwy klasy ........................................................ 228
   Ujawnianie modyfikatorów klasy ....................................... 229
   Ustalanie klasy bazowej ..................................................... 230
   Ustalanie interfejsów implementowanych przez klasę ........ 232
   Ujawnianie składowych klasy ............................................. 233
   Ujawnianie konstruktorów klasy ........................................... 234
   Ujawnianie informacji o metodach ..................................... 236

                                                                                        7
Spis treści


         Odczytywanie wartości składowych .................................... 239
         Zapisywanie wartości składowych klas ............................... 240
         Wywoływanie metod ......................................................... 242
         Wczytywanie klasy i dynamiczne tworzenie jej obiektów .... 244

    17 Tworzenie pakietów i dokumentacji ..............................247
       Tworzenie pakietu .............................................................. 248
       Dokumentowanie klas za pomocą JavaDoc ......................... 251
       Archiwizacja klas w pakiecie JAR ........................................... 254
       Uruchamianie programu z archiwum JAR ........................... 255

         Skorowidz ......................................................................257




8
naczna część operacji wykonywanych w programach
— niezależnie od języka programowania — polega na
manipulowaniu ciągami znaków, ponieważ poza danymi
liczbowymi nasze dane mają zazwyczaj właśnie postać cią-
gów. Nawet dane liczbowe są często traktowane jako proste
ciągi znaków. Trudno więc wyobrazić sobie jakiś skoń-
czony program, który wcale nie korzystałby z ciągów.

Ćwiczenia zebrane w tym rozdziale ilustrują sposób wy-
konania najbardziej typowych operacji na ciągach zna-
ków. Język Java oferuje mocne narzędzia do obsługi
ciągów znaków i ich przetwarzania. W przeciwieństwie do
ciągów w języku C, w Javie ciągi znaków są typami wbu-
dowanymi. Do przechowywania i reprezentowania ciągów
znaków w Javie zaimplementowano klasę String. Ciągi
w Javie nie powinny być traktowane jako proste tablice
ROZDZIAŁ 3              Porównywanie ciągów


                        znaków, znane z języka C. Wszędzie tam, gdzie w Javie
                        ma być przechowany ciąg znaków, powinieneś zamiast
                        prostej tablicy zastosować klasę String.

                        Ważną cechą klasy String w języku Java jest niezmien-
                        ność obiektów tej klasy — raz utworzony ciąg pozostaje
                        niezmienny przez cały swój czas życia w programie. Po
                        utworzeniu obiektu ciągu nie można go zmieniać. Co
                        najwyżej można przypisać ciąg do innego obiektu klasy
                        String, ale zmiany zawartości ciągu nie można wykonać
                        na jednym egzemplarzu String. Z tego względu w klasie
MANIPULOWANIE CIĄGAMI




                        String nie znajdziesz żadnej metody ustawiającej war-
                        tość ciągu. Jeśli chcesz utworzyć ciąg, do którego bę-
                        dziesz mógł dopisywać dane, to zamiast klasy String
                        powinieneś w JDK 1.5 wykorzystać klasę StringBuilder;
                        w starszych wydaniach Javy jej odpowiednikiem byłaby
                        klasa StringBuffer. Obie klasy przewidują zmienność
                        swoich obiektów, więc dają możliwość zmiany za-
                        wartości reprezentowanych ciągów. Słowem, konstru-
                        owanie ciągów odbywa się typowo za pośrednictwem
                        klasy StringBuilder albo StringBuffer, natomiast do
                        przechowywania ciągów i ich przekazywania najlepsza
                        jest klasa String.



                        Porównywanie ciągów
                         boolean result = str1.equals(str2);
                         boolean result2 = str1.equalsIgnoreCase(str2);


                        Jeśli oba porównywane obiekty ciągów str1 i str2 będą
                        miały tę samą zawartość, zmienne result i result2
       32
Porównywanie ciągów




                                                             ROZDZIAŁ 3
przyjmą wartości logiczne „prawda” (true). Jeśli ciągi
będą różne, result i result2 przyjmą wartość logiczną
„fałsz” (false). Pierwsza z metod porównujących —
equals() — porównuje odpowiednie znaki obu ciągów
z uwzględnieniem wielkości liter. Druga metoda —
equalsIgnoreCase() — porównuje ciągi bez uwzględ-
niania wielkości liter i zwraca true, jeśli porównywane
ciągi mają tę samą „treść”, z pominięciem różnic w wiel-
kości poszczególnych liter.

Porównywanie ciągów bywa przyczyną wielu błędów,




                                                             MANIPULOWANIE CIĄGAMI
popełnianych zwłaszcza przez niedoświadczonych pro-
gramistów języka Java. Otóż programista-nowicjusz często
próbuje porównać ciągi za pomocą operatora porównania
==. Tymczasem operator ten, gdy zostanie użyty z obiek-
tami String, porównuje referencje obiektów, a nie ich
zawartość. Z tego powodu nawet dwa identyczne pod
względem wartości obiekty ciągów będą różne, jeśli po-
równanie odbędzie się za pośrednictwem operatora ==.

Metoda equals() klasy String porównuje zawartość
ciągów, a nie jedynie referencje obiektów. Właśnie tak
powinno się porównywać ciągi w zdecydowanej więk-
szości przypadków. Spójrz na poniższy przykład:

 String name1 = new String("Tomek");
 String name2 = new String("Tomek");
 if (name1 == name2) {
     System.out.println("Ciągi są równe.");
 }
 else {
     System.out.println("Ciągi są różne.");
 }

                                                              33
ROZDZIAŁ 3              Porównywanie ciągów


                        Na wyjściu powyższego programu powinieneś zobaczyć
                        napis:

                         Ciągi są różne.


                        Spróbujmy teraz porównać te same ciągi metodą equals():

                         String name1 = new String("Tomek");
                         String name2 = new String("Tomek");
                         if (name1.equals(name2)) {
                             System.out.println("Ciągi są równe.");
                         }
                         else {
MANIPULOWANIE CIĄGAMI




                             System.out.println("Ciągi są różne.");
                         }


                        Tym razem program powinien wypisać:

                         Ciągi są równe.


                        Inną metodą związaną z porównywaniem obiektów klasy
                        String jest metoda compareTo(). Służy ona do leksyko-
                        graficznego porównywania dwóch ciągów i zwraca nie
                        wartość logiczną, ale liczbową: dodatnią, ujemną albo
                        zerową. Wartość 0 jest zwracana jedynie dla takich dwóch
                        ciągów, dla których metoda equals() dałaby wartość
                        true. Wartość ujemna wskazuje, że ciąg, na rzecz którego
                        wywołano metodę, jest „pierwszy”, to znaczy alfabe-
                        tycznie poprzedza drugi ciąg uczestniczący w porówna-
                        niu, przekazany w wywołaniu metody. Z kolei wartość
                        dodatnia oznacza, że ciąg, na rzecz którego wywołano
                        metodę, jest alfabetycznie za ciągiem przekazanym w wy-
                        wołaniu. Gwoli ścisłości, porównanie odbywa się na bazie
                        wartości Unicode poszczególnych, odpowiadających sobie

       34
Wyszukiwanie i wyłuskiwanie podciągów




                                                                ROZDZIAŁ 3
znaków porównywanych ciągów. Metoda compareTo() ma
również swój odpowiednik ignorujący wielkość liter —
compareToIgnoreCase(). Działa on tak samo, tyle że
przy porównywaniu znaków nie uwzględnia wielkości
liter. Spójrzmy na następny przykład:

 String name1 = "Kowalski";
 String name2 = "Nowak";
 int result = name1.compareTo(name2);
 if (result == 0) {
     System.out.println("Nazwiska są identyczne.");
 }




                                                                MANIPULOWANIE CIĄGAMI
 else if (result > 0) {
     System.out.println("Nazwisko name1 jest
     åalfabetycznie pierwsze.");
 }
 else if (result < 0) {
     System.out.println("Nazwisko name1 jest
     åalfabetycznie drugie.");
 }


W przypadku tego programu powinniśmy otrzymać na
wyjściu taki komunikat:

 Nazwisko name1 jest alfabetycznie drugie.




Wyszukiwanie i wyłuskiwanie
podciągów
 int result = string1.indexOf(string2);
 int result = string1.indexOf(string2, 5);


Wywołanie pierwszej z powyższych metod powinno umie-
ścić w zmiennej result indeks pierwszego wystąpienia
                                                                 35
ROZDZIAŁ 3              Wyszukiwanie i wyłuskiwanie podciągów


                        podciągu string2 w ciągu string1. Jeśli w ciągu string1
                        nie ma ciągu string2, metoda zwróci wartość -1.

                        W drugiej z powyższych metod wartość zwracana będzie
                        zawierać indeks pierwszego wystąpienia podciągu string2
                        w ciągu string1, ale za piątym znakiem w string1.
                        Wartością drugiego argumentu może być dowolna liczba
                        większa od zera. Jeśli będzie większa od długości prze-
                        szukiwanego ciągu, metoda zwróci -1.

                        Oprócz wyszukiwania podciągu w ciągu trzeba czasem
MANIPULOWANIE CIĄGAMI




                        dowiedzieć się, gdzie znajduje się interesujący nas pod-
                        ciąg, i przy okazji wyłuskać go z przeszukiwanego ciągu.
                        Jak dotąd umiemy jedynie zlokalizować potrzebny pod-
                        ciąg w ciągu. Kiedy ustalisz jego indeks, możesz go wyłu-
                        skać za pomocą metody substring() klasy String.
                        Metoda substring() jest przeciążona, co oznacza, że
                        można ją wywoływać na kilka sposobów. Jeden z nich
                        polega na przekazaniu indeksu podciągu do wyłuskania.
                        W tej wersji metoda zwraca podciąg zaczynający się od
                        wskazanego znaku i rozciągający się aż do końca ciągu
                        źródłowego. Kolejny sposób to wywołanie substring()
                        z dwoma argumentami: indeksem początku i indeksem
                        końca ciągu.

                         String string1 = "Mój adres to Polna 33";
                         String address = string1.substring(13);
                         System.out.println(address);


                        W przypadku takiego programu powinniśmy otrzymać na
                        wyjściu napis:

                         Polna 33

       36
Przetwarzanie ciągu znak po znaku




                                                                   ROZDZIAŁ 3
Na 13. pozycji w ciągu string1 znajduje się P; to jest
początek naszego podciągu. Zauważ, że ciągi znaków są
zawsze indeksowane od zera, a ostatni znak ciągu znaj-
duje się pod indeksem -1 (koniec ciągu).



Przetwarzanie ciągu
znak po znaku
 for (int index = 0; index < string1.length(); index++) {




                                                                   MANIPULOWANIE CIĄGAMI
     char aChar = string1.charAt(index);
 }


Metoda charAt() pozwala na pozyskanie pojedynczego
znaku wyłuskanego z ciągu spod wskazanej pozycji. Znaki
są indeksowane w ciągu od zera, to znaczy mają numery
od 0 do liczby równej długości ciągu zmniejszonej o jeden.
Powyższa pętla przetwarza kolejne znaki ciągu string1.

Alternatywna metoda operowania na poszczególnych zna-
kach wykorzystuje klasę StringReader, jak tutaj:

 StringReader reader = new StringReader(string1);
 int singleChar = reader.read();


Mechanizm ten polega na wyłuskiwaniu poszczególnych
znaków ciągu za pomocą metody read() klasy String-
Reader; znak jest zwracany jako liczba całkowita. Pierwsze
wywołanie read() zwraca liczbę reprezentującą pierwszy
znak ciągu, za każdym kolejnym wywołaniem zwracana
jest reprezentacja następnego znaku w ciągu.

                                                                    37
ROZDZIAŁ 3              Odwracanie znaków w ciągu



                        Odwracanie znaków w ciągu
                         String letters = "ABCDEF";
                         StringBuffer lettersBuff = new StringBuffer(letters);
                         String lettersRev = lettersBuff.reverse().toString();


                        Klasa StringBuffer zawiera metodę reverse() zwraca-
                        jącą kopię ciągu zawartego w obiekcie StringBuffer z od-
                        wróconą kolejnością znaków. Obiekt StringBuffer daje
                        się łatwo konwertować na ciąg typu String — służy do
                        tego metoda toString() klasy StringBuffer. Dlatego za
MANIPULOWANIE CIĄGAMI




                        pomocą tymczasowego, roboczego obiektu StringBuffer
                        można w łatwy sposób utworzyć lustrzane odbicie pier-
                        wotnego ciągu.

                        Jeśli korzystasz z JDK 1.5, możesz zamiast klasy String-
                        Buffer wykorzystać klasę StringBuilder. Klasa ta ma
                        interfejs zgodny z interfejsem klasy StringBuffer. Klasa
                        StringBuilder oferuje większą wydajność, ale jej metody
                        nie są synchronizowane, co oznacza, że obiekty klasy nie są
                        zabezpieczone pod kątem wykonania wielowątkowego.
                        W aplikacjach wielowątkowych należałoby więc stosować
                        klasę StringBuffer.



                        Odwracanie wyrazów w ciągu
                         String test = "Odwróć ten ciąg znaków";
                         Stack stack = new Stack();
                         StringTokenizer strTok = new StringTokenizer(test);

                         while (strTok.hasMoreTokens()) {
                             stack.push(strTok.nextElement());

       38
Odwracanie wyrazów w ciągu




                                                              ROZDZIAŁ 3
 }
 StringBuffer revStr = new StringBuffer();
 while (!stack.empty()) {
     revStr.append(stack.pop());
     revStr.append(" ");
 }
 System.out.println("Ciąg pierwotny: " + test);
 System.out.println("Ciąg odwrócony: " + revStr);


W przypadku powyższego fragmentu programu powin-
niśmy otrzymać w wyniku taki zestaw napisów:

 Ciąg pierwotny: Odwróć ten ciąg znaków




                                                              MANIPULOWANIE CIĄGAMI
 Ciąg odwrócony: znaków ciąg ten Odwróć


Jak widać, odwracanie ciągu wyraz po wyrazie jest nieco
bardziej skomplikowane niż odwracanie kolejności po-
szczególnych znaków. To dlatego, że odwracanie znaków
w ciągu jest implementowane w ramach implementacji klasy
StringBuffer, ale klasa ta nijak nie obsługuje odwraca-
nia kolejności poszczególnych wyrazów. Musimy to za-
danie oprogramować samodzielnie, wykorzystując do tego
celu klasy StringTokenizer i Stack. StringTokenizer
służy do wyłuskiwania z ciągu kolejnych wyrazów roz-
dzielanych wskazanym separatorem; wyrazy te są odkła-
dane na stos reprezentowany przez obiekt klasy Stack.
Po przetworzeniu w ten sposób całego ciągu przegląda-
my elementy stosu, zdejmując z niego kolejne słowa
w kolejności odwrotnej do kolejności wstawiania na stos.
Stos jest wcieleniem kolejki LIFO — last in, first out,
czyli „ostatni na wejściu, pierwszy na wyjściu”. Wyko-
rzystanie stosu znakomicie ułatwia operację odwracania.


                                                               39
ROZDZIAŁ 3              Zamiana wszystkich liter w ciągu na wielkie albo na małe


                        Nieco więcej informacji o klasie StringTokenizer znaj-
                        dziesz jeszcze w tym rozdziale, przy okazji omawiania
                        przetwarzania ciągu wyrazów rozdzielanych przecinkami.

                         UWAGA
                         Jeśli korzystasz z JDK 1.5, powinieneś koniecznie zapoznać
                         się z pewną nowinką w postaci klasy Scanner. Co prawda,
                         nie omawiam jej tu, ale jest dość ciekawa, ponieważ imple-
                         mentuje prosty skaner tekstowy zdatny do analizowania
                         i wyłuskiwania z ciągów wartości typów prostych i podcią-
MANIPULOWANIE CIĄGAMI




                         gów dopasowywanych za pomocą wyrażeń regularnych.



                        Zamiana wszystkich liter
                        w ciągu na wielkie albo na małe
                         String string = "Ciąg zawiera maŁE i WIElkie litery";
                         String string2 = string.toUpperCase();
                         String string3 = string.toLowerCase();


                        Obie metody służą do zamiany wielkości liter w ciągu zna-
                        ków — albo na same małe, albo na same wielkie litery.
                        Obie metody zwracają przerobione kopie ciągu, ale nie
                        modyfikują ciągu pierwotnego. Pierwotny ciąg zachowuje
                        oryginalne wielkości znaków.

                        Metody te znajdują praktyczne zastosowania choćby w ope-
                        racjach wymagających składowania danych w bazach da-
                        nych. Niektóre pola w tabelach mogą być zaprojektowane
                        tak, aby zapisywane w nich ciągi zawierały wyłącznie


       40
Usuwanie zbędnych spacji z początku i końca ciągu




                                                                      ROZDZIAŁ 3
wielkie albo wyłącznie małe litery. Dzięki omawianym
metodom zamiana wielkości liter nie stanowi żadnego
problemu.

Zmiana wielkości liter przydaje się także przy przetwa-
rzaniu identyfikatorów kont użytkowników. Zazwyczaj
identyfikator użytkownika jest w bazie danych polem
o wartościach z dowolnymi wielkościami znaków, w prze-
ciwieństwie do hasła, w którym wielkość znaków ma ko-
losalne znaczenie. Przy porównywaniu podanego przez
użytkownika identyfikatora z tym, który zapisany jest




                                                                      MANIPULOWANIE CIĄGAMI
w bazie danych, najlepiej, aby oba porównywane ciągi
zostały uprzednio skonwertowane na odpowiednią wiel-
kość liter. Alternatywą byłoby zastosowanie metody
equalsIgnoreCase() klasy String, która realizuje porów-
nanie bez uwzględniania wielkości liter.



Usuwanie zbędnych spacji
z początku i końca ciągu
 String result = str.trim();


Metoda trim() usuwa z ciągu zarówno początkowe, jak
i końcowe spacje oraz inne znaki odstępów (ang. white-
spaces) i zwraca „obrany” ciąg. Pierwotny ciąg pozostaje
oczywiście niezmieniony. Jeśli w ciągu nie ma żadnych po-
czątkowych ani końcowych znaków odstępu do usunięcia,



                                                                       41
ROZDZIAŁ 3              Przetwarzanie ciągu wyrazów oddzielanych przecinkami


                        metoda zwraca po prostu pierwotny ciąg. Do znaków
                        odstępów zaliczane są między innymi znaki spacji i ta-
                        bulacji1.

                        Przydaje się to bardzo przy porównywaniu ciągów wpro-
                        wadzanych przez użytkownika na wejście programu z cią-
                        gami zaszytymi w programie albo odczytywanymi ze
                        znanych źródeł. Programista często całymi godzinami
                        ślęczy nad niedziałającym kodem tylko po to, by przekonać
                        się, że to, co wprowadza, niedokładnie zgadza się z oczeki-
                        waniami programu, a różnica polega np. na umieszcza-
MANIPULOWANIE CIĄGAMI




                        niu na wejściu niewinnej, początkowej spacji. Obcięcie
                        zbędnych znaków odstępów eliminuje takie problemy.



                        Przetwarzanie ciągu wyrazów
                        oddzielanych przecinkami
                            String str = "timothy,kerry,timmy,camden";
                            String[] results = str.split(",");


                        Metoda split() wywołana na rzecz obiektu klasy String
                        przyjmuje w wywołaniu ciąg wyrażenia regularnego re-
                        prezentujący separator wyrazów ciągu i zwraca tablicę
                        obiektów String wyłuskanych z ciągu źródłowego na

                        1
                            Ściśle mówiąc, do wycinanych znaków zaliczają się wszystkie
                            znaki o kodach mniejszych od 'u0020', który to kod reprezentuje
                            właśnie spację. Znak tabulacji ma kod 'u0007'; znak nowego
                            wiersza to 'u0010'; znak 'u0013' to znak powrotu karetki
                            itd. — przyp. tłum.

       42
Przetwarzanie ciągu wyrazów oddzielanych przecinkami




                                                                         ROZDZIAŁ 3
podstawie wyrażenia regularnego separatora. Dzięki tej
metodzie przetwarzanie ciągów oddzielanych przecinkami
jest zupełnie proste. W tym przykładzie najzwyczajniej
przekazujemy do metody split() ciąg separatora, a w od-
powiedzi otrzymujemy tablicę ciągów zawierających wyrazy
rozpoznane w ciągu źródłowym (str) pomiędzy prze-
cinkami. Tablica powinna składać się z następujących
elementów:

 results[0]   =   timothy
 results[1]   =   kerry




                                                                         MANIPULOWANIE CIĄGAMI
 results[2]   =   timmy
 results[3]   =   camden


Inną klasą bardzo przydatną do wykonywania podziału
ciągów jest klasa StringTokenizer. Wykorzystamy ją
zamiast metody split() do powtórzenia ostatniego ćwi-
czenia:

 String str = "timothy,kerry,timmy,camden";
 StringTokenizer st = new StringTokenizer(str, ",");
 while (st.hasMoreTokens()) {
     System.out.println(st.nextToken());
 }


Ten fragment programu powinien spowodować wypisa-
nie na wyjściu następujących podciągów (każdy w osob-
nym wierszu):

 timothy
 kerry
 timmy
 camden




                                                                          43
ROZDZIAŁ 3              Przetwarzanie ciągu wyrazów oddzielanych przecinkami


                        Zauważ, że przecinki oddzielające wyrazy zostały pomi-
                        nięte i nie widać ich na wyjściu.

                        Obiekt klasy StringTokenizer można konstruować z jed-
                        nym, dwoma albo trzema argumentami. W wersji z jed-
                        nym argumentem argument ten jest traktowany jako ciąg
                        do podziału na wyrazy. Za separator służy w takim przy-
                        padku separator domyślny, czyli zestaw znaków oddzie-
                        lających wyrazy w języku naturalnym: " tnrf", a więc
                        spacja, znak tabulacji, znak nowego wiersza, znak po-
                        wrotu karetki i znak wysuwu strony.
MANIPULOWANIE CIĄGAMI




                        Drugi sposób tworzenia obiektu klasy StringTokenizer
                        polega na przekazaniu do konstruktora dwóch argumen-
                        tów. Pierwszy to ciąg do podziału, a drugi to ciąg okre-
                        ślający separator, wedle którego dokonany zostanie podział.
                        Przekazanie własnego separatora unieważnia separator
                        domyślny — podział odbywa się wyłącznie na podstawie
                        separatora określonego w wywołaniu konstruktora.

                        Trzeci sposób konstrukcji obiektu StringTokenizer po-
                        lega na przekazaniu trzech argumentów. Trzeci argu-
                        ment określa, czy do wyodrębnianych wyrazów należy
                        zaliczać również same separatory, czy je pomijać. Argu-
                        ment ten jest wartością boole’owską; wartość true ozna-
                        cza, że w tablicy wyodrębnionych ciągów pojawią się
                        również rozdzielające je symbole podziału. Domyślna
                        wartość to false — przy tej wartości separatory są po-
                        mijane.




       44
Przetwarzanie ciągu wyrazów oddzielanych przecinkami




                                                                     ROZDZIAŁ 3
W ramach lektury uzupełniającej koniecznie zajrzyj do
rozdziału szóstego, gdzie omawiamy wyrażenia regu-
larne. Pojawiły się one w Javie w wydaniu JDK 1.4
i można nimi zastąpić wiele przypadków użycia klasy
StringTokenizer. Oficjalna dokumentacja Javy stwier-
dza, że klasa StringTokenizer jest włączana do imple-
mentacji Javy ze względu na zgodność wstecz, i zniechęca
do jej stosowania w nowszych projektach. Tam, gdzie to
możliwe, należy ją zastępować metodą split() klasy
String albo stosować wyrażenia regularne.




                                                                     MANIPULOWANIE CIĄGAMI




                                                                      45

Contenu connexe

Tendances

mod_perl. Podręcznik programisty
mod_perl. Podręcznik programistymod_perl. Podręcznik programisty
mod_perl. Podręcznik programistyWydawnictwo Helion
 
100 sposobów na serwery Windows
100 sposobów na serwery Windows100 sposobów na serwery Windows
100 sposobów na serwery WindowsWydawnictwo Helion
 
Mandrake Linux. Ćwiczenia zaawansowane
Mandrake Linux. Ćwiczenia zaawansowaneMandrake Linux. Ćwiczenia zaawansowane
Mandrake Linux. Ćwiczenia zaawansowaneWydawnictwo Helion
 
Red Hat Linux 8. Ćwiczenia praktyczne
Red Hat Linux 8. Ćwiczenia praktyczneRed Hat Linux 8. Ćwiczenia praktyczne
Red Hat Linux 8. Ćwiczenia praktyczneWydawnictwo Helion
 
Po prostu własny serwer internetowy
Po prostu własny serwer internetowyPo prostu własny serwer internetowy
Po prostu własny serwer internetowyWydawnictwo Helion
 
PHP. Praktyczne skrypty, które oszczędzą Twój czas
PHP. Praktyczne skrypty, które oszczędzą Twój czasPHP. Praktyczne skrypty, które oszczędzą Twój czas
PHP. Praktyczne skrypty, które oszczędzą Twój czasWydawnictwo Helion
 
Aplikacje w Delphi. Przykłady. Wydanie II
Aplikacje w Delphi. Przykłady. Wydanie IIAplikacje w Delphi. Przykłady. Wydanie II
Aplikacje w Delphi. Przykłady. Wydanie IIWydawnictwo Helion
 
Efektywne programowanie w języku Java
Efektywne programowanie w języku JavaEfektywne programowanie w języku Java
Efektywne programowanie w języku JavaWydawnictwo Helion
 
Delphi 2007 dla WIN32 i bazy danych
Delphi 2007 dla WIN32 i bazy danychDelphi 2007 dla WIN32 i bazy danych
Delphi 2007 dla WIN32 i bazy danychWydawnictwo Helion
 
Język C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistówJęzyk C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistówWydawnictwo Helion
 
Wyjątkowy język C++. 40 nowych łamigłówek, zadań programistycznych i rozwiązań
Wyjątkowy język C++. 40 nowych łamigłówek, zadań programistycznych i rozwiązańWyjątkowy język C++. 40 nowych łamigłówek, zadań programistycznych i rozwiązań
Wyjątkowy język C++. 40 nowych łamigłówek, zadań programistycznych i rozwiązańWydawnictwo Helion
 
Java 2. Techniki zaawansowane. Wydanie II
Java 2. Techniki zaawansowane. Wydanie IIJava 2. Techniki zaawansowane. Wydanie II
Java 2. Techniki zaawansowane. Wydanie IIWydawnictwo Helion
 

Tendances (20)

mod_perl. Podręcznik programisty
mod_perl. Podręcznik programistymod_perl. Podręcznik programisty
mod_perl. Podręcznik programisty
 
100 sposobów na serwery Windows
100 sposobów na serwery Windows100 sposobów na serwery Windows
100 sposobów na serwery Windows
 
Rozbudowa i naprawa serwerów
Rozbudowa i naprawa serwerówRozbudowa i naprawa serwerów
Rozbudowa i naprawa serwerów
 
PHP5. Praktyczny kurs
PHP5. Praktyczny kursPHP5. Praktyczny kurs
PHP5. Praktyczny kurs
 
Mandrake Linux. Ćwiczenia zaawansowane
Mandrake Linux. Ćwiczenia zaawansowaneMandrake Linux. Ćwiczenia zaawansowane
Mandrake Linux. Ćwiczenia zaawansowane
 
Red Hat Linux 8. Ćwiczenia praktyczne
Red Hat Linux 8. Ćwiczenia praktyczneRed Hat Linux 8. Ćwiczenia praktyczne
Red Hat Linux 8. Ćwiczenia praktyczne
 
Python. Rozmówki
Python. RozmówkiPython. Rozmówki
Python. Rozmówki
 
Po prostu własny serwer internetowy
Po prostu własny serwer internetowyPo prostu własny serwer internetowy
Po prostu własny serwer internetowy
 
JavaScript dla każdego
JavaScript dla każdegoJavaScript dla każdego
JavaScript dla każdego
 
Flash i PHP5. Podstawy
Flash i PHP5. PodstawyFlash i PHP5. Podstawy
Flash i PHP5. Podstawy
 
Po prostu Red Hat Linux 9
Po prostu Red Hat Linux 9Po prostu Red Hat Linux 9
Po prostu Red Hat Linux 9
 
PHP. Praktyczne skrypty, które oszczędzą Twój czas
PHP. Praktyczne skrypty, które oszczędzą Twój czasPHP. Praktyczne skrypty, które oszczędzą Twój czas
PHP. Praktyczne skrypty, które oszczędzą Twój czas
 
ActionScript. Receptury
ActionScript. RecepturyActionScript. Receptury
ActionScript. Receptury
 
Aplikacje w Delphi. Przykłady. Wydanie II
Aplikacje w Delphi. Przykłady. Wydanie IIAplikacje w Delphi. Przykłady. Wydanie II
Aplikacje w Delphi. Przykłady. Wydanie II
 
Efektywne programowanie w języku Java
Efektywne programowanie w języku JavaEfektywne programowanie w języku Java
Efektywne programowanie w języku Java
 
Delphi 2007 dla WIN32 i bazy danych
Delphi 2007 dla WIN32 i bazy danychDelphi 2007 dla WIN32 i bazy danych
Delphi 2007 dla WIN32 i bazy danych
 
Po prostu Red Hat Linux 8
Po prostu Red Hat Linux 8Po prostu Red Hat Linux 8
Po prostu Red Hat Linux 8
 
Język C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistówJęzyk C++. Gotowe rozwiązania dla programistów
Język C++. Gotowe rozwiązania dla programistów
 
Wyjątkowy język C++. 40 nowych łamigłówek, zadań programistycznych i rozwiązań
Wyjątkowy język C++. 40 nowych łamigłówek, zadań programistycznych i rozwiązańWyjątkowy język C++. 40 nowych łamigłówek, zadań programistycznych i rozwiązań
Wyjątkowy język C++. 40 nowych łamigłówek, zadań programistycznych i rozwiązań
 
Java 2. Techniki zaawansowane. Wydanie II
Java 2. Techniki zaawansowane. Wydanie IIJava 2. Techniki zaawansowane. Wydanie II
Java 2. Techniki zaawansowane. Wydanie II
 

En vedette

Visual Basic 2005. Wprowadzenie do programowania w .NET
Visual Basic 2005. Wprowadzenie do programowania w .NETVisual Basic 2005. Wprowadzenie do programowania w .NET
Visual Basic 2005. Wprowadzenie do programowania w .NETWydawnictwo Helion
 
Zrozumieć platformę .NET. Wydanie II
Zrozumieć platformę .NET. Wydanie IIZrozumieć platformę .NET. Wydanie II
Zrozumieć platformę .NET. Wydanie IIWydawnictwo Helion
 
MySQL. Szybki start. Wydanie II
MySQL. Szybki start. Wydanie IIMySQL. Szybki start. Wydanie II
MySQL. Szybki start. Wydanie IIWydawnictwo Helion
 
Pozycjonowanie i optymalizacja stron WWW. Jak to się robi
Pozycjonowanie i optymalizacja stron WWW. Jak to się robiPozycjonowanie i optymalizacja stron WWW. Jak to się robi
Pozycjonowanie i optymalizacja stron WWW. Jak to się robiWydawnictwo Helion
 
Sekrety mistrza fotografii cyfrowej. 195 ujęć Scotta Kelbyego
Sekrety mistrza fotografii cyfrowej. 195 ujęć Scotta KelbyegoSekrety mistrza fotografii cyfrowej. 195 ujęć Scotta Kelbyego
Sekrety mistrza fotografii cyfrowej. 195 ujęć Scotta KelbyegoWydawnictwo Helion
 
Java. Tworzenie aplikacji sieciowych za pomocą Springa, Hibernate i Eclipse
Java. Tworzenie aplikacji sieciowych za pomocą Springa, Hibernate i EclipseJava. Tworzenie aplikacji sieciowych za pomocą Springa, Hibernate i Eclipse
Java. Tworzenie aplikacji sieciowych za pomocą Springa, Hibernate i EclipseWydawnictwo Helion
 
PowerPoint 2007 PL. Ćwiczenia
PowerPoint 2007 PL. ĆwiczeniaPowerPoint 2007 PL. Ćwiczenia
PowerPoint 2007 PL. ĆwiczeniaWydawnictwo Helion
 
Windows XP. Naprawa i optymalizacja. Ćwiczenia praktyczne
Windows XP. Naprawa i optymalizacja. Ćwiczenia praktyczneWindows XP. Naprawa i optymalizacja. Ćwiczenia praktyczne
Windows XP. Naprawa i optymalizacja. Ćwiczenia praktyczneWydawnictwo Helion
 
Access 2007 PL. Ćwiczenia praktyczne
Access 2007 PL. Ćwiczenia praktyczneAccess 2007 PL. Ćwiczenia praktyczne
Access 2007 PL. Ćwiczenia praktyczneWydawnictwo Helion
 
Komputer PC w biurze i nie tylko
Komputer PC w biurze i nie tylkoKomputer PC w biurze i nie tylko
Komputer PC w biurze i nie tylkoWydawnictwo Helion
 
C++ dla programistów gier. Wydanie II
C++ dla programistów gier. Wydanie IIC++ dla programistów gier. Wydanie II
C++ dla programistów gier. Wydanie IIWydawnictwo Helion
 

En vedette (14)

ABC nagrywania płyt
ABC nagrywania płytABC nagrywania płyt
ABC nagrywania płyt
 
Visual Basic 2005. Wprowadzenie do programowania w .NET
Visual Basic 2005. Wprowadzenie do programowania w .NETVisual Basic 2005. Wprowadzenie do programowania w .NET
Visual Basic 2005. Wprowadzenie do programowania w .NET
 
Zrozumieć platformę .NET. Wydanie II
Zrozumieć platformę .NET. Wydanie IIZrozumieć platformę .NET. Wydanie II
Zrozumieć platformę .NET. Wydanie II
 
MySQL. Szybki start. Wydanie II
MySQL. Szybki start. Wydanie IIMySQL. Szybki start. Wydanie II
MySQL. Szybki start. Wydanie II
 
Pozycjonowanie i optymalizacja stron WWW. Jak to się robi
Pozycjonowanie i optymalizacja stron WWW. Jak to się robiPozycjonowanie i optymalizacja stron WWW. Jak to się robi
Pozycjonowanie i optymalizacja stron WWW. Jak to się robi
 
Sekrety mistrza fotografii cyfrowej. 195 ujęć Scotta Kelbyego
Sekrety mistrza fotografii cyfrowej. 195 ujęć Scotta KelbyegoSekrety mistrza fotografii cyfrowej. 195 ujęć Scotta Kelbyego
Sekrety mistrza fotografii cyfrowej. 195 ujęć Scotta Kelbyego
 
Java. Tworzenie aplikacji sieciowych za pomocą Springa, Hibernate i Eclipse
Java. Tworzenie aplikacji sieciowych za pomocą Springa, Hibernate i EclipseJava. Tworzenie aplikacji sieciowych za pomocą Springa, Hibernate i Eclipse
Java. Tworzenie aplikacji sieciowych za pomocą Springa, Hibernate i Eclipse
 
PowerPoint 2007 PL. Ćwiczenia
PowerPoint 2007 PL. ĆwiczeniaPowerPoint 2007 PL. Ćwiczenia
PowerPoint 2007 PL. Ćwiczenia
 
Windows XP. Naprawa i optymalizacja. Ćwiczenia praktyczne
Windows XP. Naprawa i optymalizacja. Ćwiczenia praktyczneWindows XP. Naprawa i optymalizacja. Ćwiczenia praktyczne
Windows XP. Naprawa i optymalizacja. Ćwiczenia praktyczne
 
ABC Access 2007 PL
ABC Access 2007 PLABC Access 2007 PL
ABC Access 2007 PL
 
SWiSHmax. Ćwiczenia
SWiSHmax. ĆwiczeniaSWiSHmax. Ćwiczenia
SWiSHmax. Ćwiczenia
 
Access 2007 PL. Ćwiczenia praktyczne
Access 2007 PL. Ćwiczenia praktyczneAccess 2007 PL. Ćwiczenia praktyczne
Access 2007 PL. Ćwiczenia praktyczne
 
Komputer PC w biurze i nie tylko
Komputer PC w biurze i nie tylkoKomputer PC w biurze i nie tylko
Komputer PC w biurze i nie tylko
 
C++ dla programistów gier. Wydanie II
C++ dla programistów gier. Wydanie IIC++ dla programistów gier. Wydanie II
C++ dla programistów gier. Wydanie II
 

Similaire à Java. Rozmówki

Similaire à Java. Rozmówki (20)

Delphi. Szybki start
Delphi. Szybki startDelphi. Szybki start
Delphi. Szybki start
 
Java. Kompendium programisty
Java. Kompendium programistyJava. Kompendium programisty
Java. Kompendium programisty
 
Praktyczny kurs Java
Praktyczny kurs JavaPraktyczny kurs Java
Praktyczny kurs Java
 
Core Java Servlets i JavaServer Pages. Tom II. Wydanie II
Core Java Servlets i JavaServer Pages. Tom II. Wydanie IICore Java Servlets i JavaServer Pages. Tom II. Wydanie II
Core Java Servlets i JavaServer Pages. Tom II. Wydanie II
 
Spring. Zapiski programisty
Spring. Zapiski programistySpring. Zapiski programisty
Spring. Zapiski programisty
 
PHP. Rozmówki
PHP. RozmówkiPHP. Rozmówki
PHP. Rozmówki
 
Programowanie w języku C. Szybki start
Programowanie w języku C. Szybki startProgramowanie w języku C. Szybki start
Programowanie w języku C. Szybki start
 
Java. Wprowadzenie
Java. WprowadzenieJava. Wprowadzenie
Java. Wprowadzenie
 
Java. Sztuka programowania
Java. Sztuka programowaniaJava. Sztuka programowania
Java. Sztuka programowania
 
Java. Potrzaski
Java. PotrzaskiJava. Potrzaski
Java. Potrzaski
 
Java. Współbieżność dla praktyków
Java. Współbieżność dla praktykówJava. Współbieżność dla praktyków
Java. Współbieżność dla praktyków
 
Delphi 7 dla każdego
Delphi 7 dla każdegoDelphi 7 dla każdego
Delphi 7 dla każdego
 
PHP w mgnieniu oka
PHP w mgnieniu okaPHP w mgnieniu oka
PHP w mgnieniu oka
 
Praktyczny kurs asemblera
Praktyczny kurs asembleraPraktyczny kurs asemblera
Praktyczny kurs asemblera
 
JavaServer Faces. Wydanie II
JavaServer Faces. Wydanie IIJavaServer Faces. Wydanie II
JavaServer Faces. Wydanie II
 
Praktyczny kurs Java. Wydanie II
Praktyczny kurs Java. Wydanie IIPraktyczny kurs Java. Wydanie II
Praktyczny kurs Java. Wydanie II
 
Prolog. Programowanie
Prolog. ProgramowanieProlog. Programowanie
Prolog. Programowanie
 
ABC Delphi 2006
ABC Delphi 2006ABC Delphi 2006
ABC Delphi 2006
 
Programowanie w języku C. FAQ
Programowanie w języku C. FAQProgramowanie w języku C. FAQ
Programowanie w języku C. FAQ
 
C# i ASP.NET. Szybki start
C# i ASP.NET. Szybki startC# i ASP.NET. Szybki start
C# i ASP.NET. Szybki start
 

Plus de Wydawnictwo Helion

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyWydawnictwo Helion
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikWydawnictwo Helion
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczneWydawnictwo Helion
 
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesieE-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesieWydawnictwo Helion
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsWydawnictwo Helion
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IIWydawnictwo Helion
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuWydawnictwo Helion
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIWydawnictwo Helion
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningWydawnictwo Helion
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykWydawnictwo Helion
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaWydawnictwo Helion
 

Plus de Wydawnictwo Helion (20)

Tworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. ProjektyTworzenie filmów w Windows XP. Projekty
Tworzenie filmów w Windows XP. Projekty
 
Blog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnikBlog, więcej niż internetowy pamiętnik
Blog, więcej niż internetowy pamiętnik
 
Access w biurze i nie tylko
Access w biurze i nie tylkoAccess w biurze i nie tylko
Access w biurze i nie tylko
 
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktycznePozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
Pozycjonowanie i optymalizacja stron WWW. Ćwiczenia praktyczne
 
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesieE-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
E-wizerunek. Internet jako narzędzie kreowania image&#39;u w biznesie
 
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla WindowsMicrosoft Visual C++ 2008. Tworzenie aplikacji dla Windows
Microsoft Visual C++ 2008. Tworzenie aplikacji dla Windows
 
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie IICo potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
Co potrafi Twój iPhone? Podręcznik użytkownika. Wydanie II
 
Makrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółuMakrofotografia. Magia szczegółu
Makrofotografia. Magia szczegółu
 
Windows PowerShell. Podstawy
Windows PowerShell. PodstawyWindows PowerShell. Podstawy
Windows PowerShell. Podstawy
 
Java. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie IIJava. Efektywne programowanie. Wydanie II
Java. Efektywne programowanie. Wydanie II
 
JavaScript. Pierwsze starcie
JavaScript. Pierwsze starcieJavaScript. Pierwsze starcie
JavaScript. Pierwsze starcie
 
Ajax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny treningAjax, JavaScript i PHP. Intensywny trening
Ajax, JavaScript i PHP. Intensywny trening
 
PowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktykPowerPoint 2007 PL. Seria praktyk
PowerPoint 2007 PL. Seria praktyk
 
Excel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktykExcel 2007 PL. Seria praktyk
Excel 2007 PL. Seria praktyk
 
Access 2007 PL. Seria praktyk
Access 2007 PL. Seria praktykAccess 2007 PL. Seria praktyk
Access 2007 PL. Seria praktyk
 
Word 2007 PL. Seria praktyk
Word 2007 PL. Seria praktykWord 2007 PL. Seria praktyk
Word 2007 PL. Seria praktyk
 
Serwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacjaSerwisy społecznościowe. Budowa, administracja i moderacja
Serwisy społecznościowe. Budowa, administracja i moderacja
 
AutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PLAutoCAD 2008 i 2008 PL
AutoCAD 2008 i 2008 PL
 
Bazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcieBazy danych. Pierwsze starcie
Bazy danych. Pierwsze starcie
 
Inventor. Pierwsze kroki
Inventor. Pierwsze krokiInventor. Pierwsze kroki
Inventor. Pierwsze kroki
 

Java. Rozmówki

  • 1. Java. Rozmówki Autor: Timothy R. Fisher T³umaczenie: Przemys³aw Szeremiota ISBN: 978-83-246-0949-9 Tytu³ orygina³u: Java Phrasebook Format: B6, stron: 272 Zwiêz³y przewodnik opisuj¹cy najczêœciej u¿ywane instrukcje jêzyka Java • Naucz siê kompilowaæ i uruchamiaæ programy w Javie • Poznaj najpopularniejsze polecenia tego jêzyka • Pisz programy dzia³aj¹ce na wielu platformach Ju¿ od wielu lat Java jest jednym z najpopularniejszych jêzyków programowania, a znaj¹cy j¹ programiœci s¹ poszukiwani i cenieni na rynku pracy. Jej atrakcyjnoœæ wynika g³ównie z tego, ¿e kod napisany w tym jêzyku mo¿na uruchamiaæ na wielu platformach, w³¹czaj¹c w to ró¿ne systemy operacyjne, a tak¿e urz¹dzenia przenoœne, na przyk³ad telefony komórkowe. Prosty jest tak¿e dostêp do wielu narzêdzi oraz bezp³atnych bibliotek u³atwiaj¹cych programowanie w Javie. Ponadto jêzyk ten otwiera wielkie mo¿liwoœci w zakresie tworzenia aplikacji sieciowych. „Java. Rozmówki” przedstawia skuteczne rozwi¹zania najczêœciej wystêpuj¹cych problemów i pomo¿e Ci b³yskawicznie rozpocz¹æ programowanie w tym jêzyku. Dowiesz siê, jak kompilowaæ i uruchamiaæ programy w Javie. Nauczysz siê manipulowaæ ci¹gami, strukturami danych i datami oraz stosowaæ wyra¿enia regularne. Poznasz operacje wejœcia i wyjœcia, a tak¿e sposoby pracy z katalogami i plikami. Przeczytasz o aplikacjach sieciowych dzia³aj¹cych zarówno po stronie klienta, jak i po stronie serwera. Opanujesz efektywne techniki pracy z bazami danych i korzystanie z formatu XML. • Kompilowanie i uruchamianie programów w Javie • Wspó³praca ze œrodowiskiem • Obs³uga ci¹gów i liczb • Korzystanie ze struktur danych • Operacje wejœcia i wyjœcia • Manipulowanie plikami i katalogami • Praca z klientami i serwerami sieciowymi Wydawnictwo Helion • Komunikacja z bazami danych i u¿ywanie XML ul. Koœciuszki 1c • Programowanie wielow¹tkowe 44-100 Gliwice Dziêki treœciwym rozmówkom b³yskawicznie poznasz tel. 032 230 98 63 praktyczne podstawy programowania w Javie e-mail: helion@helion.pl
  • 2. O autorze ......................................................................... 11 Wprowadzenie ................................................................ 13 1 Podstawy ......................................................................... 17 Kompilowanie programu w Javie ......................................... 19 Uruchamianie programu w Javie .......................................... 21 Ustawianie zmiennej CLASSPATH ......................................... 22 2 Interakcje z otoczeniem ................................................... 25 Odczytywanie zmiennych środowiskowych .......................... 26 Odczytywanie i ustawianie właściwości systemowych .......... 27 Przetwarzanie argumentów wywołania programu ............... 28 3 Manipulowanie ciągami .................................................. 31 Porównywanie ciągów ......................................................... 32 Wyszukiwanie i wyłuskiwanie podciągów ............................ 35 Przetwarzanie ciągu znak po znaku ...................................... 37 Odwracanie znaków w ciągu ............................................... 38 Odwracanie wyrazów w ciągu ............................................. 38
  • 3. Spis treści Zamiana wszystkich liter w ciągu na wielkie albo na małe ....... 40 Usuwanie zbędnych spacji z początku i końca ciągu ............. 41 Przetwarzanie ciągu wyrazów oddzielanych przecinkami ...... 42 4 Praca ze strukturami danych ............................................47 Zmiana rozmiaru tablicy ....................................................... 48 Przeglądanie kolekcji ............................................................ 49 Tworzenie odwzorowania .................................................... 51 Porządkowanie kolekcji ........................................................ 53 Wyszukiwanie obiektu w kolekcji ......................................... 55 Konwersja kolekcji na tablicę ................................................ 58 5 Daty i godziny ..................................................................59 Określanie bieżącej daty ....................................................... 60 Konwersja pomiędzy klasami Date i Calendar ....................... 61 Wyświetlanie daty (godziny) w zadanym formacie ............... 62 Wyodrębnianie dat z ciągów znaków ................................... 65 Dodawanie i odejmowanie obiektów Date bądź Calendar .... 67 Obliczanie różnicy pomiędzy dwiema datami ....................... 68 Porównywanie dat ............................................................... 69 Określanie numeru dnia w tygodniu, miesiąca w roku albo tygodnia w roku ............................................. 71 Obliczanie czasu trwania operacji ......................................... 72 6 Dopasowywanie wzorców za pomocą wyrażeń regularnych .....................................................75 Wyrażenia regularne w Javie ................................................ 76 Wyszukiwanie i dopasowywanie tekstu za pomocą wyrażenia regularnego ..................................... 79 Zastępowanie dopasowanego tekstu ................................... 82 Wyszukiwanie wszystkich wystąpień wzorca ........................ 84 Wypisywanie wierszy zawierających wzorzec ....................... 85 Dopasowywanie znaków nowego wiersza ........................... 86 4
  • 4. Spis treści 7 Liczby ............................................................................... 89 Sprawdzanie, czy ciąg zawiera poprawną liczbę ................... 90 Porównywanie liczb zmiennoprzecinkowych ........................ 91 Zaokrąglanie liczb zmiennoprzecinkowych ........................... 93 Formatowanie liczb .............................................................. 94 Formatowanie wartości monetarnych ................................... 97 Konwersja dziesiętnej liczby całkowitej na zapis dwójkowy, ósemkowy bądź szesnastkowy ......................... 98 Generowanie liczb losowych ................................................ 98 Funkcje trygonometryczne .................................................. 100 Obliczanie logarytmów ...................................................... 100 8 Wejście i wyjście ........................................................... 103 Odczytywanie tekstu ze standardowego wejścia programu ............................................................ 104 Wypisywanie do standardowego wyjścia ........................... 105 Formatowanie wyjścia ....................................................... 106 Otwieranie pliku identyfikowanego przez nazwę ................ 112 Wczytanie zawartości pliku do tablicy bajtów .................... 112 Wczytywanie danych binarnych ......................................... 113 Przesuwanie pozycji w pliku ............................................... 114 Odczytywanie archiwum JAR albo ZIP ................................ 115 Tworzenie archiwum ZIP .................................................... 116 9 Praca z katalogami i plikami .......................................... 119 Tworzenie pliku ................................................................. 120 Zmiana nazwy pliku lub katalogu ....................................... 122 Usuwanie pliku albo katalogu ............................................ 123 Zmiana atrybutów pliku ..................................................... 124 Ustalanie rozmiaru pliku .................................................... 125 Sprawdzanie obecności pliku lub katalogu ......................... 126 5
  • 5. Spis treści Przenoszenie pliku lub katalogu ......................................... 127 Ustalanie bezwzględnej ścieżki dostępu na podstawie ścieżki względnej ....................................... 128 Ustalanie, czy ścieżka dostępu określa plik, czy katalog ...... 129 Wypisywanie zawartości katalogu ...................................... 131 Tworzenie nowego katalogu .............................................. 135 10 Klienty sieciowe .............................................................137 Nawiązywanie połączenia z serwerem ............................... 138 Ustalanie adresów IP i nazw domenowych ......................... 139 Obsługa błędów sieciowych ............................................... 140 Wczytywanie danych (tekstu) z gniazda .............................. 142 Zapisywanie do gniazda ..................................................... 143 Wczytywanie danych binarnych ......................................... 144 Zapisywanie danych binarnych ........................................... 146 Wczytywanie danych serializowanych ................................ 148 Zapis serializowanego obiektu ........................................... 149 Pobieranie strony WWW przez HTTP .................................. 151 11 Serwery sieciowe ...........................................................155 Uruchamianie serwera i przyjmowanie żądań ..................... 156 Zwracanie odpowiedzi ....................................................... 157 Odsyłanie obiektu .............................................................. 159 Obsługa wielu klientów ...................................................... 161 Udostępnianie treści przez HTTP ......................................... 163 12 Wysyłanie i odbieranie poczty elektronicznej ................167 Przegląd JavaMail API ........................................................ 168 Wysyłanie poczty ............................................................... 169 Wysyłanie wiadomości MIME ............................................. 172 Odbieranie poczty .............................................................. 175 6
  • 6. Spis treści 13 Dostęp do baz danych ................................................... 179 Nawiązywanie połączenia z bazą danych przez JDBC ......... 180 Wysyłanie zapytania przez JDBC ........................................ 183 Stosowanie zapytań sparametryzowanych ......................... 185 Pobieranie wyników zapytania ........................................... 187 Uruchamianie procedury składowanej ................................ 189 14 XML w Javie .................................................................. 193 Analiza XML za pomocą SAX .............................................. 195 Analiza XML za pomocą DOM ............................................ 198 Weryfikowanie poprawności dokumentu względem DTD ... 201 Tworzenie dokumentu XML za pomocą DOM ..................... 203 Przekształcanie XML za pomocą XSLT ................................. 206 15 Stosowanie wątków ...................................................... 209 Uruchamianie wątku .......................................................... 210 Zatrzymywanie wątku ........................................................ 213 Oczekiwanie zakończenia wątku ........................................... 214 Synchronizowanie wątków ................................................ 216 Wstrzymywanie wątku ....................................................... 220 Wypisywanie listy wątków ................................................. 222 16 Programowanie dynamiczne z introspekcją .................. 225 Ustalanie klasy obiektu ...................................................... 227 Ustalanie nazwy klasy ........................................................ 228 Ujawnianie modyfikatorów klasy ....................................... 229 Ustalanie klasy bazowej ..................................................... 230 Ustalanie interfejsów implementowanych przez klasę ........ 232 Ujawnianie składowych klasy ............................................. 233 Ujawnianie konstruktorów klasy ........................................... 234 Ujawnianie informacji o metodach ..................................... 236 7
  • 7. Spis treści Odczytywanie wartości składowych .................................... 239 Zapisywanie wartości składowych klas ............................... 240 Wywoływanie metod ......................................................... 242 Wczytywanie klasy i dynamiczne tworzenie jej obiektów .... 244 17 Tworzenie pakietów i dokumentacji ..............................247 Tworzenie pakietu .............................................................. 248 Dokumentowanie klas za pomocą JavaDoc ......................... 251 Archiwizacja klas w pakiecie JAR ........................................... 254 Uruchamianie programu z archiwum JAR ........................... 255 Skorowidz ......................................................................257 8
  • 8. naczna część operacji wykonywanych w programach — niezależnie od języka programowania — polega na manipulowaniu ciągami znaków, ponieważ poza danymi liczbowymi nasze dane mają zazwyczaj właśnie postać cią- gów. Nawet dane liczbowe są często traktowane jako proste ciągi znaków. Trudno więc wyobrazić sobie jakiś skoń- czony program, który wcale nie korzystałby z ciągów. Ćwiczenia zebrane w tym rozdziale ilustrują sposób wy- konania najbardziej typowych operacji na ciągach zna- ków. Język Java oferuje mocne narzędzia do obsługi ciągów znaków i ich przetwarzania. W przeciwieństwie do ciągów w języku C, w Javie ciągi znaków są typami wbu- dowanymi. Do przechowywania i reprezentowania ciągów znaków w Javie zaimplementowano klasę String. Ciągi w Javie nie powinny być traktowane jako proste tablice
  • 9. ROZDZIAŁ 3 Porównywanie ciągów znaków, znane z języka C. Wszędzie tam, gdzie w Javie ma być przechowany ciąg znaków, powinieneś zamiast prostej tablicy zastosować klasę String. Ważną cechą klasy String w języku Java jest niezmien- ność obiektów tej klasy — raz utworzony ciąg pozostaje niezmienny przez cały swój czas życia w programie. Po utworzeniu obiektu ciągu nie można go zmieniać. Co najwyżej można przypisać ciąg do innego obiektu klasy String, ale zmiany zawartości ciągu nie można wykonać na jednym egzemplarzu String. Z tego względu w klasie MANIPULOWANIE CIĄGAMI String nie znajdziesz żadnej metody ustawiającej war- tość ciągu. Jeśli chcesz utworzyć ciąg, do którego bę- dziesz mógł dopisywać dane, to zamiast klasy String powinieneś w JDK 1.5 wykorzystać klasę StringBuilder; w starszych wydaniach Javy jej odpowiednikiem byłaby klasa StringBuffer. Obie klasy przewidują zmienność swoich obiektów, więc dają możliwość zmiany za- wartości reprezentowanych ciągów. Słowem, konstru- owanie ciągów odbywa się typowo za pośrednictwem klasy StringBuilder albo StringBuffer, natomiast do przechowywania ciągów i ich przekazywania najlepsza jest klasa String. Porównywanie ciągów boolean result = str1.equals(str2); boolean result2 = str1.equalsIgnoreCase(str2); Jeśli oba porównywane obiekty ciągów str1 i str2 będą miały tę samą zawartość, zmienne result i result2 32
  • 10. Porównywanie ciągów ROZDZIAŁ 3 przyjmą wartości logiczne „prawda” (true). Jeśli ciągi będą różne, result i result2 przyjmą wartość logiczną „fałsz” (false). Pierwsza z metod porównujących — equals() — porównuje odpowiednie znaki obu ciągów z uwzględnieniem wielkości liter. Druga metoda — equalsIgnoreCase() — porównuje ciągi bez uwzględ- niania wielkości liter i zwraca true, jeśli porównywane ciągi mają tę samą „treść”, z pominięciem różnic w wiel- kości poszczególnych liter. Porównywanie ciągów bywa przyczyną wielu błędów, MANIPULOWANIE CIĄGAMI popełnianych zwłaszcza przez niedoświadczonych pro- gramistów języka Java. Otóż programista-nowicjusz często próbuje porównać ciągi za pomocą operatora porównania ==. Tymczasem operator ten, gdy zostanie użyty z obiek- tami String, porównuje referencje obiektów, a nie ich zawartość. Z tego powodu nawet dwa identyczne pod względem wartości obiekty ciągów będą różne, jeśli po- równanie odbędzie się za pośrednictwem operatora ==. Metoda equals() klasy String porównuje zawartość ciągów, a nie jedynie referencje obiektów. Właśnie tak powinno się porównywać ciągi w zdecydowanej więk- szości przypadków. Spójrz na poniższy przykład: String name1 = new String("Tomek"); String name2 = new String("Tomek"); if (name1 == name2) { System.out.println("Ciągi są równe."); } else { System.out.println("Ciągi są różne."); } 33
  • 11. ROZDZIAŁ 3 Porównywanie ciągów Na wyjściu powyższego programu powinieneś zobaczyć napis: Ciągi są różne. Spróbujmy teraz porównać te same ciągi metodą equals(): String name1 = new String("Tomek"); String name2 = new String("Tomek"); if (name1.equals(name2)) { System.out.println("Ciągi są równe."); } else { MANIPULOWANIE CIĄGAMI System.out.println("Ciągi są różne."); } Tym razem program powinien wypisać: Ciągi są równe. Inną metodą związaną z porównywaniem obiektów klasy String jest metoda compareTo(). Służy ona do leksyko- graficznego porównywania dwóch ciągów i zwraca nie wartość logiczną, ale liczbową: dodatnią, ujemną albo zerową. Wartość 0 jest zwracana jedynie dla takich dwóch ciągów, dla których metoda equals() dałaby wartość true. Wartość ujemna wskazuje, że ciąg, na rzecz którego wywołano metodę, jest „pierwszy”, to znaczy alfabe- tycznie poprzedza drugi ciąg uczestniczący w porówna- niu, przekazany w wywołaniu metody. Z kolei wartość dodatnia oznacza, że ciąg, na rzecz którego wywołano metodę, jest alfabetycznie za ciągiem przekazanym w wy- wołaniu. Gwoli ścisłości, porównanie odbywa się na bazie wartości Unicode poszczególnych, odpowiadających sobie 34
  • 12. Wyszukiwanie i wyłuskiwanie podciągów ROZDZIAŁ 3 znaków porównywanych ciągów. Metoda compareTo() ma również swój odpowiednik ignorujący wielkość liter — compareToIgnoreCase(). Działa on tak samo, tyle że przy porównywaniu znaków nie uwzględnia wielkości liter. Spójrzmy na następny przykład: String name1 = "Kowalski"; String name2 = "Nowak"; int result = name1.compareTo(name2); if (result == 0) { System.out.println("Nazwiska są identyczne."); } MANIPULOWANIE CIĄGAMI else if (result > 0) { System.out.println("Nazwisko name1 jest åalfabetycznie pierwsze."); } else if (result < 0) { System.out.println("Nazwisko name1 jest åalfabetycznie drugie."); } W przypadku tego programu powinniśmy otrzymać na wyjściu taki komunikat: Nazwisko name1 jest alfabetycznie drugie. Wyszukiwanie i wyłuskiwanie podciągów int result = string1.indexOf(string2); int result = string1.indexOf(string2, 5); Wywołanie pierwszej z powyższych metod powinno umie- ścić w zmiennej result indeks pierwszego wystąpienia 35
  • 13. ROZDZIAŁ 3 Wyszukiwanie i wyłuskiwanie podciągów podciągu string2 w ciągu string1. Jeśli w ciągu string1 nie ma ciągu string2, metoda zwróci wartość -1. W drugiej z powyższych metod wartość zwracana będzie zawierać indeks pierwszego wystąpienia podciągu string2 w ciągu string1, ale za piątym znakiem w string1. Wartością drugiego argumentu może być dowolna liczba większa od zera. Jeśli będzie większa od długości prze- szukiwanego ciągu, metoda zwróci -1. Oprócz wyszukiwania podciągu w ciągu trzeba czasem MANIPULOWANIE CIĄGAMI dowiedzieć się, gdzie znajduje się interesujący nas pod- ciąg, i przy okazji wyłuskać go z przeszukiwanego ciągu. Jak dotąd umiemy jedynie zlokalizować potrzebny pod- ciąg w ciągu. Kiedy ustalisz jego indeks, możesz go wyłu- skać za pomocą metody substring() klasy String. Metoda substring() jest przeciążona, co oznacza, że można ją wywoływać na kilka sposobów. Jeden z nich polega na przekazaniu indeksu podciągu do wyłuskania. W tej wersji metoda zwraca podciąg zaczynający się od wskazanego znaku i rozciągający się aż do końca ciągu źródłowego. Kolejny sposób to wywołanie substring() z dwoma argumentami: indeksem początku i indeksem końca ciągu. String string1 = "Mój adres to Polna 33"; String address = string1.substring(13); System.out.println(address); W przypadku takiego programu powinniśmy otrzymać na wyjściu napis: Polna 33 36
  • 14. Przetwarzanie ciągu znak po znaku ROZDZIAŁ 3 Na 13. pozycji w ciągu string1 znajduje się P; to jest początek naszego podciągu. Zauważ, że ciągi znaków są zawsze indeksowane od zera, a ostatni znak ciągu znaj- duje się pod indeksem -1 (koniec ciągu). Przetwarzanie ciągu znak po znaku for (int index = 0; index < string1.length(); index++) { MANIPULOWANIE CIĄGAMI char aChar = string1.charAt(index); } Metoda charAt() pozwala na pozyskanie pojedynczego znaku wyłuskanego z ciągu spod wskazanej pozycji. Znaki są indeksowane w ciągu od zera, to znaczy mają numery od 0 do liczby równej długości ciągu zmniejszonej o jeden. Powyższa pętla przetwarza kolejne znaki ciągu string1. Alternatywna metoda operowania na poszczególnych zna- kach wykorzystuje klasę StringReader, jak tutaj: StringReader reader = new StringReader(string1); int singleChar = reader.read(); Mechanizm ten polega na wyłuskiwaniu poszczególnych znaków ciągu za pomocą metody read() klasy String- Reader; znak jest zwracany jako liczba całkowita. Pierwsze wywołanie read() zwraca liczbę reprezentującą pierwszy znak ciągu, za każdym kolejnym wywołaniem zwracana jest reprezentacja następnego znaku w ciągu. 37
  • 15. ROZDZIAŁ 3 Odwracanie znaków w ciągu Odwracanie znaków w ciągu String letters = "ABCDEF"; StringBuffer lettersBuff = new StringBuffer(letters); String lettersRev = lettersBuff.reverse().toString(); Klasa StringBuffer zawiera metodę reverse() zwraca- jącą kopię ciągu zawartego w obiekcie StringBuffer z od- wróconą kolejnością znaków. Obiekt StringBuffer daje się łatwo konwertować na ciąg typu String — służy do tego metoda toString() klasy StringBuffer. Dlatego za MANIPULOWANIE CIĄGAMI pomocą tymczasowego, roboczego obiektu StringBuffer można w łatwy sposób utworzyć lustrzane odbicie pier- wotnego ciągu. Jeśli korzystasz z JDK 1.5, możesz zamiast klasy String- Buffer wykorzystać klasę StringBuilder. Klasa ta ma interfejs zgodny z interfejsem klasy StringBuffer. Klasa StringBuilder oferuje większą wydajność, ale jej metody nie są synchronizowane, co oznacza, że obiekty klasy nie są zabezpieczone pod kątem wykonania wielowątkowego. W aplikacjach wielowątkowych należałoby więc stosować klasę StringBuffer. Odwracanie wyrazów w ciągu String test = "Odwróć ten ciąg znaków"; Stack stack = new Stack(); StringTokenizer strTok = new StringTokenizer(test); while (strTok.hasMoreTokens()) { stack.push(strTok.nextElement()); 38
  • 16. Odwracanie wyrazów w ciągu ROZDZIAŁ 3 } StringBuffer revStr = new StringBuffer(); while (!stack.empty()) { revStr.append(stack.pop()); revStr.append(" "); } System.out.println("Ciąg pierwotny: " + test); System.out.println("Ciąg odwrócony: " + revStr); W przypadku powyższego fragmentu programu powin- niśmy otrzymać w wyniku taki zestaw napisów: Ciąg pierwotny: Odwróć ten ciąg znaków MANIPULOWANIE CIĄGAMI Ciąg odwrócony: znaków ciąg ten Odwróć Jak widać, odwracanie ciągu wyraz po wyrazie jest nieco bardziej skomplikowane niż odwracanie kolejności po- szczególnych znaków. To dlatego, że odwracanie znaków w ciągu jest implementowane w ramach implementacji klasy StringBuffer, ale klasa ta nijak nie obsługuje odwraca- nia kolejności poszczególnych wyrazów. Musimy to za- danie oprogramować samodzielnie, wykorzystując do tego celu klasy StringTokenizer i Stack. StringTokenizer służy do wyłuskiwania z ciągu kolejnych wyrazów roz- dzielanych wskazanym separatorem; wyrazy te są odkła- dane na stos reprezentowany przez obiekt klasy Stack. Po przetworzeniu w ten sposób całego ciągu przegląda- my elementy stosu, zdejmując z niego kolejne słowa w kolejności odwrotnej do kolejności wstawiania na stos. Stos jest wcieleniem kolejki LIFO — last in, first out, czyli „ostatni na wejściu, pierwszy na wyjściu”. Wyko- rzystanie stosu znakomicie ułatwia operację odwracania. 39
  • 17. ROZDZIAŁ 3 Zamiana wszystkich liter w ciągu na wielkie albo na małe Nieco więcej informacji o klasie StringTokenizer znaj- dziesz jeszcze w tym rozdziale, przy okazji omawiania przetwarzania ciągu wyrazów rozdzielanych przecinkami. UWAGA Jeśli korzystasz z JDK 1.5, powinieneś koniecznie zapoznać się z pewną nowinką w postaci klasy Scanner. Co prawda, nie omawiam jej tu, ale jest dość ciekawa, ponieważ imple- mentuje prosty skaner tekstowy zdatny do analizowania i wyłuskiwania z ciągów wartości typów prostych i podcią- MANIPULOWANIE CIĄGAMI gów dopasowywanych za pomocą wyrażeń regularnych. Zamiana wszystkich liter w ciągu na wielkie albo na małe String string = "Ciąg zawiera maŁE i WIElkie litery"; String string2 = string.toUpperCase(); String string3 = string.toLowerCase(); Obie metody służą do zamiany wielkości liter w ciągu zna- ków — albo na same małe, albo na same wielkie litery. Obie metody zwracają przerobione kopie ciągu, ale nie modyfikują ciągu pierwotnego. Pierwotny ciąg zachowuje oryginalne wielkości znaków. Metody te znajdują praktyczne zastosowania choćby w ope- racjach wymagających składowania danych w bazach da- nych. Niektóre pola w tabelach mogą być zaprojektowane tak, aby zapisywane w nich ciągi zawierały wyłącznie 40
  • 18. Usuwanie zbędnych spacji z początku i końca ciągu ROZDZIAŁ 3 wielkie albo wyłącznie małe litery. Dzięki omawianym metodom zamiana wielkości liter nie stanowi żadnego problemu. Zmiana wielkości liter przydaje się także przy przetwa- rzaniu identyfikatorów kont użytkowników. Zazwyczaj identyfikator użytkownika jest w bazie danych polem o wartościach z dowolnymi wielkościami znaków, w prze- ciwieństwie do hasła, w którym wielkość znaków ma ko- losalne znaczenie. Przy porównywaniu podanego przez użytkownika identyfikatora z tym, który zapisany jest MANIPULOWANIE CIĄGAMI w bazie danych, najlepiej, aby oba porównywane ciągi zostały uprzednio skonwertowane na odpowiednią wiel- kość liter. Alternatywą byłoby zastosowanie metody equalsIgnoreCase() klasy String, która realizuje porów- nanie bez uwzględniania wielkości liter. Usuwanie zbędnych spacji z początku i końca ciągu String result = str.trim(); Metoda trim() usuwa z ciągu zarówno początkowe, jak i końcowe spacje oraz inne znaki odstępów (ang. white- spaces) i zwraca „obrany” ciąg. Pierwotny ciąg pozostaje oczywiście niezmieniony. Jeśli w ciągu nie ma żadnych po- czątkowych ani końcowych znaków odstępu do usunięcia, 41
  • 19. ROZDZIAŁ 3 Przetwarzanie ciągu wyrazów oddzielanych przecinkami metoda zwraca po prostu pierwotny ciąg. Do znaków odstępów zaliczane są między innymi znaki spacji i ta- bulacji1. Przydaje się to bardzo przy porównywaniu ciągów wpro- wadzanych przez użytkownika na wejście programu z cią- gami zaszytymi w programie albo odczytywanymi ze znanych źródeł. Programista często całymi godzinami ślęczy nad niedziałającym kodem tylko po to, by przekonać się, że to, co wprowadza, niedokładnie zgadza się z oczeki- waniami programu, a różnica polega np. na umieszcza- MANIPULOWANIE CIĄGAMI niu na wejściu niewinnej, początkowej spacji. Obcięcie zbędnych znaków odstępów eliminuje takie problemy. Przetwarzanie ciągu wyrazów oddzielanych przecinkami String str = "timothy,kerry,timmy,camden"; String[] results = str.split(","); Metoda split() wywołana na rzecz obiektu klasy String przyjmuje w wywołaniu ciąg wyrażenia regularnego re- prezentujący separator wyrazów ciągu i zwraca tablicę obiektów String wyłuskanych z ciągu źródłowego na 1 Ściśle mówiąc, do wycinanych znaków zaliczają się wszystkie znaki o kodach mniejszych od 'u0020', który to kod reprezentuje właśnie spację. Znak tabulacji ma kod 'u0007'; znak nowego wiersza to 'u0010'; znak 'u0013' to znak powrotu karetki itd. — przyp. tłum. 42
  • 20. Przetwarzanie ciągu wyrazów oddzielanych przecinkami ROZDZIAŁ 3 podstawie wyrażenia regularnego separatora. Dzięki tej metodzie przetwarzanie ciągów oddzielanych przecinkami jest zupełnie proste. W tym przykładzie najzwyczajniej przekazujemy do metody split() ciąg separatora, a w od- powiedzi otrzymujemy tablicę ciągów zawierających wyrazy rozpoznane w ciągu źródłowym (str) pomiędzy prze- cinkami. Tablica powinna składać się z następujących elementów: results[0] = timothy results[1] = kerry MANIPULOWANIE CIĄGAMI results[2] = timmy results[3] = camden Inną klasą bardzo przydatną do wykonywania podziału ciągów jest klasa StringTokenizer. Wykorzystamy ją zamiast metody split() do powtórzenia ostatniego ćwi- czenia: String str = "timothy,kerry,timmy,camden"; StringTokenizer st = new StringTokenizer(str, ","); while (st.hasMoreTokens()) { System.out.println(st.nextToken()); } Ten fragment programu powinien spowodować wypisa- nie na wyjściu następujących podciągów (każdy w osob- nym wierszu): timothy kerry timmy camden 43
  • 21. ROZDZIAŁ 3 Przetwarzanie ciągu wyrazów oddzielanych przecinkami Zauważ, że przecinki oddzielające wyrazy zostały pomi- nięte i nie widać ich na wyjściu. Obiekt klasy StringTokenizer można konstruować z jed- nym, dwoma albo trzema argumentami. W wersji z jed- nym argumentem argument ten jest traktowany jako ciąg do podziału na wyrazy. Za separator służy w takim przy- padku separator domyślny, czyli zestaw znaków oddzie- lających wyrazy w języku naturalnym: " tnrf", a więc spacja, znak tabulacji, znak nowego wiersza, znak po- wrotu karetki i znak wysuwu strony. MANIPULOWANIE CIĄGAMI Drugi sposób tworzenia obiektu klasy StringTokenizer polega na przekazaniu do konstruktora dwóch argumen- tów. Pierwszy to ciąg do podziału, a drugi to ciąg okre- ślający separator, wedle którego dokonany zostanie podział. Przekazanie własnego separatora unieważnia separator domyślny — podział odbywa się wyłącznie na podstawie separatora określonego w wywołaniu konstruktora. Trzeci sposób konstrukcji obiektu StringTokenizer po- lega na przekazaniu trzech argumentów. Trzeci argu- ment określa, czy do wyodrębnianych wyrazów należy zaliczać również same separatory, czy je pomijać. Argu- ment ten jest wartością boole’owską; wartość true ozna- cza, że w tablicy wyodrębnionych ciągów pojawią się również rozdzielające je symbole podziału. Domyślna wartość to false — przy tej wartości separatory są po- mijane. 44
  • 22. Przetwarzanie ciągu wyrazów oddzielanych przecinkami ROZDZIAŁ 3 W ramach lektury uzupełniającej koniecznie zajrzyj do rozdziału szóstego, gdzie omawiamy wyrażenia regu- larne. Pojawiły się one w Javie w wydaniu JDK 1.4 i można nimi zastąpić wiele przypadków użycia klasy StringTokenizer. Oficjalna dokumentacja Javy stwier- dza, że klasa StringTokenizer jest włączana do imple- mentacji Javy ze względu na zgodność wstecz, i zniechęca do jej stosowania w nowszych projektach. Tam, gdzie to możliwe, należy ją zastępować metodą split() klasy String albo stosować wyrażenia regularne. MANIPULOWANIE CIĄGAMI 45