Darmowy fragment publikacji:
IDZ DO
IDZ DO
PRZYK£ADOWY ROZDZIA£
PRZYK£ADOWY ROZDZIA£
SPIS TREĎCI
SPIS TREĎCI
KATALOG KSI¥¯EK
KATALOG KSI¥¯EK
KATALOG ONLINE
KATALOG ONLINE
ZAMÓW DRUKOWANY KATALOG
ZAMÓW DRUKOWANY KATALOG
TWÓJ KOSZYK
TWÓJ KOSZYK
DODAJ DO KOSZYKA
DODAJ DO KOSZYKA
CENNIK I INFORMACJE
CENNIK I INFORMACJE
ZAMÓW INFORMACJE
ZAMÓW INFORMACJE
O NOWOĎCIACH
O NOWOĎCIACH
ZAMÓW CENNIK
ZAMÓW CENNIK
CZYTELNIA
CZYTELNIA
FRAGMENTY KSI¥¯EK ONLINE
FRAGMENTY KSI¥¯EK ONLINE
Wydawnictwo Helion
ul. Chopina 6
44-100 Gliwice
tel. (32)230-98-63
e-mail: helion@helion.pl
Java. Sztuka
programowania
Autorzy: Herbert Schildt, James Holmes
T³umaczenie: Rafa³ Joñca
ISBN: 83-7361-422-2
Tytu³ orygina³u: The Art of Java
Format: B5, stron: 324
Przejdĥ na wy¿szy poziom programowania dziêki dwóm „guru” Javy: Herbowi
Schildtowi i Jamesowi Holmesowi. Po³¹czenie ich wiedzy pozwoli Ci poznaæ wiele
sekretów i sztuczek wykorzystywanych przez profesjonalistów. W ksi¹¿ce autorzy
przedstawiaj¹ przyk³ady u¿ytecznych aplikacji oraz towarzysz¹ce im opisy u¿ytych
technologii. Prezentowane przyk³ady mo¿esz wykorzystaæ w swojej codziennej pracy.
Pocz¹wszy od interpreterów jêzyka, agentów internetowych i podsystemów e-mail,
skoñczywszy na analizatorach wyra¿eñ, narzêdziach statystycznych i apletach
finansowych — wszystkie aplikacje s¹ gotowe do u¿ycia. Mo¿na je te¿ dowolnie
modyfikowaæ i rozszerzaæ.
W ksi¹¿ce znajdziesz:
• Omówienie zalet jêzyka Java,
• Tworzenie analizatora wyra¿eñ numerycznych,
• Tworzenie agenta przeszukuj¹cego internet,
• Projektowanie i implementacja interpretera jêzyka programowania,
• Wykonanie funkcjonalnego systemu pocztowego,
• Konstruowanie programu do pobierania danych z internetu z mo¿liwoġci¹
pobierania fragmentów stron,
• Wykonanie narzêdzi statystycznych obliczaj¹cych ġrednia, medianê, modaln¹,
odchylenie standardowe, itp.
• Wykonanie apletów i serwletów finansowych obliczaj¹cych równe raty po¿yczki,
przysz³¹ wartoġæ inwestycji, kwotê emerytury, itp.
• Przeġledzenie ró¿nych technik wyszukiwania bazuj¹cych na sztucznej inteligencji,
• Zapoznanie siê z mo¿liwoġci¹ przegl¹dania stron HTML-a w Javie.
O autorach:
Herb Schildt jest jednym z najpopularniejszych autorów ksi¹¿ek o programowaniu.
Jest autorytetem w sprawach jêzyków C, C++, Java i C#, a tak¿e doskona³ym
programist¹ systemu Windows. Jego ksi¹¿ki sprzeda³y siê na ca³ym ġwiecie
w ponad 3 milionach egzemplarzy i zosta³y przet³umaczone na wiêkszoġæ jêzyków.
James Holmes jest konsultantem do spraw tworzenia programowania oraz aplikacji
serwerowych w ġrodowiskach biznesowych. Zdoby³ wiele nagród, miêdzy innymi
Summer Olympic Games oraz nagrodê Java Developer w roku 2002, przyznawan¹
przez Oracle Magazine.
Spis treści
O Autorach ...................................................h..................................... 7
Przedmowa...................................................h..................................... 9
Rozdział 1. Geniusz Javy ...................................................h................................. 13
Typy proste i obiekty — odpowiednia równowaga ...................................................i.......14
Zarządzanie pamięcią przez usuwanie niepotrzebnych obiektów.....................................15
Elegancki i prosty model wielowątkowy ...................................................i.......................16
W pełni zintegrowane wyjątki...................................................i........................................16
Zaakcentowanie znaczenia polimorfizmu...................................................i......................17
Przenośność i bezpieczeństwo dzięki kodowi bajtowemu................................................18
Bogactwo interfejsów programistycznych Javy...................................................i.............18
Aplet ...................................................i...................................................i............................19
Ciągła rewolucja...................................................i...................................................i..........20
Rozdział 2. Rekurencyjny analizator wyrażeń ...................................................h... 21
Rozdział 3.
Wyrażenia...................................................i...................................................i....................22
Analiza wyrażeń — problem...................................................i..........................................22
Przetwarzanie wyrażenia...................................................i................................................23
Rozbijanie wyrażenia ...................................................i...................................................i..25
Prosty analizator wyrażeń ...................................................i..............................................28
Opis działania analizatora ...................................................i........................................34
Dodawanie zmiennych do analizatora...................................................i............................35
Sprawdzanie składni w analizatorze rekurencyjnym ...................................................i.....43
Aplet kalkulatora ...................................................i...................................................i.........44
Możliwe modyfikacje...................................................i...................................................i..46
Implementacja interpreterów języków w Javie................................... 47
Jaki język programowana interpretować? ...................................................i......................48
Wstęp do interpretera ...................................................i...................................................i..49
Interpreter języka SBASIC...................................................i.............................................50
Analizator wyrażeń języka SBASIC ...................................................i..............................67
Wyrażenia w SBASIC ...................................................i.............................................67
Tokeny SBASIC ...................................................i...................................................i...68
Interpreter ...................................................i...................................................i....................72
Klasa InterpreterException ...................................................i......................................72
Konstruktor klasy SBasic...................................................i.........................................72
Słowa kluczowe ...................................................i...................................................i....74
Metoda run() ...................................................i...................................................i.........75
Metoda sbInterp()...................................................i...................................................i..76
Przypisanie...................................................i...................................................i............77
4
Java. Sztuka programowania
Instrukcja PRINT ...................................................i...................................................i..78
Instrukcja INPUT...................................................i...................................................i..79
Instrukcja GOTO ...................................................i...................................................i..80
Instrukcja IF ...................................................i...................................................i..........83
Pętla FOR...................................................i...................................................i..............83
Instrukcja GOSUB ...................................................i...................................................i86
Instrukcja END ...................................................i...................................................i.....87
Wykorzystanie języka SBASIC ...................................................i.....................................87
Inne przykładowe programy języka SBASIC...................................................i..........88
Rozszerzanie interpretera ...................................................i...............................................90
Tworzenie własnego języka programowania ...................................................i.................90
Rozdział 4. Wykonanie menedżera pobierania plików w Javie .............................. 91
Sposoby pobierania plików z internetu ...................................................i..........................92
Omówienie programu...................................................i...................................................i..92
Klasa Download ...................................................i...................................................i..........93
Zmienne pobierania ...................................................i.................................................97
Konstruktor klasy...................................................i...................................................i..97
Metoda download()...................................................i..................................................97
Metoda run() ...................................................i...................................................i.........97
Metoda stateChanged() ...................................................i..........................................101
Metody akcesorowe i działań...................................................i.................................101
Klasa ProgressRenderer ...................................................i...............................................101
Klasa DownloadsTableModel ...................................................i......................................102
Metoda addDownload() ...................................................i.........................................104
Metoda clearDownload() ...................................................i.......................................105
Metoda getColumnClass() ...................................................i.....................................105
Metoda getValueAt() ...................................................i.............................................105
Metoda update() ...................................................i...................................................i..106
Klasa DownloadManager...................................................i.............................................106
Zmienne klasy DownloadManager ...................................................i........................111
Konstruktor klasy...................................................i...................................................i112
Metoda verifyUrl()...................................................i.................................................112
Metoda tableSelectionChanged()...................................................i...........................113
Metoda updateButtons()...................................................i.........................................113
Obsługa zdarzeń akcji ...................................................i............................................114
Kompilacja i uruchamianie programu...................................................i..........................115
Rozszerzanie możliwości programu...................................................i.............................115
Rozdział 5.
Implementacja klienta e-mail w Javie ............................................. 117
Poczta elektroniczna od podszewki...................................................i..............................118
POP3 ...................................................i...................................................i...................118
IMAP...................................................i...................................................i...................118
SMTP ...................................................i...................................................i..................118
Ogólna procedura wysyłania lub odbierania wiadomości e-mail .............................119
Interfejs programistyczny JavaMail ...................................................i.............................119
Ogólny opis wykorzystania biblioteki ...................................................i...................120
Prosty klient poczty elektronicznej ...................................................i..............................121
Klasa ConnectDialog ...................................................i.............................................122
Klasa DownloadingDialog...................................................i.....................................127
Klasa MessageDialog...................................................i.............................................128
Klasa MessageTableModel...................................................i....................................134
Klasa EmailClient ...................................................i..................................................138
Kompilacja i uruchamianie klienta poczty...................................................i...................153
Rozszerzanie możliwości klienta ...................................................i.................................154
Spis treści
5
Rozdział 6. Przeszukiwanie sieci za pomocą Javy.............................................. 155
Podstawy funkcjonowania agenta internetowego ...................................................i........156
Omówienie protokołu robot ...................................................i.........................................157
Wprowadzenie do agenta wyszukiwania ...................................................i.....................158
Klasa SearchCrawler ...................................................i...................................................i.158
Zmienne klasy...................................................i...................................................i.....173
Konstruktor klasy SearchCrawler ...................................................i..........................173
Metoda actionSearch() ...................................................i...........................................174
Metoda search() ...................................................i...................................................i..176
Metoda showError()...................................................i...............................................179
Metoda updateStats() ...................................................i.............................................179
Metoda addMatch()...................................................i................................................180
Metoda verifyUrl()...................................................i.................................................180
Metoda isRobotAllowed() ...................................................i.....................................181
Metoda downloadPage() ...................................................i........................................183
Metoda removeWwwFromUrl() ...................................................i............................184
Metoda retrieveLinks() ...................................................i..........................................185
Metoda searchStringMatches() ...................................................i..............................191
Metoda crawl()...................................................i...................................................i....192
Kompilacja i uruchomienie programu...................................................i..........................194
Możliwe zastosowania agentów internetowych...................................................i...........196
Rozdział 7. Rendering HTML w Javie ...................................................h............. 197
Rendering HTML w edytorze JEditorPane...................................................i..................197
Obsługa zdarzeń łączy...................................................i..................................................198
Tworzenie prostej przeglądarki internetowej...................................................i...............199
Klasa MiniBrowser ...................................................i................................................199
Zmienne klasy MiniBrowser...................................................i..................................204
Konstruktor klasy...................................................i...................................................i205
Metoda actionBack()...................................................i..............................................205
Metoda actionForward() ...................................................i........................................206
Metoda actionGo() ...................................................i.................................................206
Metoda showError()...................................................i...............................................207
Metoda verifyUrl()...................................................i.................................................207
Metoda showPage() ...................................................i...............................................207
Metoda updateButtons()...................................................i.........................................209
Metoda hyperlinkUpdate()...................................................i.....................................210
Kompilacja i uruchomienie przeglądarki ...................................................i.....................210
Zastosowania renderingu HTML ...................................................i.................................211
Rozdział 8. Statystyka i wykresy ...................................................h.................. 213
Próbki, zbiory, rozkład i zmienne ...................................................i................................214
Podstawy statystyki ...................................................i...................................................i...215
Średnia ...................................................i...................................................i................215
Mediana...................................................i...................................................i...............216
Moda (dominanta)...................................................i..................................................216
Wariancje i odchylenie standardowe...................................................i............................218
Równanie regresji...................................................i...................................................i......219
Współczynnik korelacji ...................................................i.........................................221
Cała klasa Stats......................................i...................................................i.......................223
Tworzenie wykresów ...................................................i...................................................i226
Skalowanie danych ...................................................i................................................226
Klasa Graphs...................................................i...................................................i.......227
Zmienne klasy Graphs ...................................................i...........................................231
Konstruktor klasy Graphs ...................................................i......................................232
Metoda paint()...................................................i...................................................i.....234
6
Java. Sztuka programowania
Metoda bargraph() ...................................................i.................................................237
Metoda scatter() ...................................................i...................................................i..237
Metoda regplot() ...................................................i...................................................i.237
Aplikacja tworzenia statystyk ...................................................i......................................238
Konstruktor klasy StatsWin ...................................................i...................................242
Procedura obsługi itemStateChanged()...................................................i..................243
Metoda actionPerformed() ...................................................i.....................................244
Metoda shutdown() ...................................................i................................................244
Metoda createMenu()...................................................i.............................................244
Klasa DataWin ...................................................i...................................................i....244
Łączymy wszystko razem ...................................................i......................................245
Prosty aplet ze statystykami ...................................................i.........................................247
Możliwe udoskonalenia...................................................i................................................249
Rozdział 9. Aplety i serwlety finansowe...................................................h......... 251
Znajdowanie raty kredytu...................................................i.............................................252
Pola apletu...................................................i...................................................i...........255
Metoda init() ...................................................i...................................................i.......256
Metoda actionPerformed() ...................................................i.....................................258
Metoda paint()...................................................i...................................................i.....258
Metoda compute()...................................................i..................................................259
Znajdowanie przyszłej wartości inwestycji...................................................i..................260
Znajdowanie wkładu początkowego wymaganego
do uzyskania przyszłej wartości inwestycji...................................................i...............263
Znalezienie inwestycji początkowej wymaganej do uzyskania odpowiedniej emerytury ......267
Znajdowanie maksymalnej emerytury dla danej inwestycji ...........................................271
Obliczenie pozostałej kwoty do spłaty kredytu...................................................i............275
Tworzenie serwletów finansowych...................................................i..............................278
Serwer Tomcat ...................................................i...................................................i....278
Konwersja apletu RegPay do serwletu ...................................................i..................280
Serwlet RegPayS...................................................i...................................................i.280
Możliwe rozszerzenia...................................................i...................................................i283
Rozdział 10. Rozwiązywanie problemów za pomocą sztucznej inteligencji ............ 285
Reprezentacja i terminologia...................................................i........................................286
Rosnąca liczba kombinacji...................................................i...........................................287
Techniki wyszukiwania...................................................i................................................288
Obliczanie wyszukiwania ...................................................i......................................289
Problem ...................................................i...................................................i.....................289
Reprezentacja graficzna ...................................................i.........................................290
Klasa FlightInfo.......................................i...................................................i.....................291
Wyszukiwanie w głąb ...................................................i..................................................291
Analiza wyszukiwania w głąb ...................................................i...............................300
Wyszukiwanie wszerz ...................................................i..................................................300
Analiza wyszukiwania wszerz ...................................................i...............................302
Dodanie heurystyki ...................................................i...................................................i...303
Wyszukiwanie wspinaczkowe ...................................................i...............................304
Analiza wyszukiwania wspinaczkowego...................................................i...............308
Wyszukiwanie najmniejszego kosztu ...................................................i....................309
Analiza wyszukiwania najmniejszego kosztu...................................................i........310
Znajdowanie wielu rozwiązań...................................................i......................................311
Usuwanie ścieżek...................................................i...................................................i311
Usuwanie węzłów ...................................................i..................................................312
Znalezienie „optymalnego” rozwiązania ...................................................i.....................317
Powrót do zagubionych kluczy ...................................................i....................................321
Skorowidz...................................................h................................... 325
Rozdział 8.
Statystyka i wykresy
Autor: Herb Schildt
Javy używa się przede wszystkim do tworzenia małych programów, na przykład apletów
i serwletów, służących do przetwarzania i wyświetlania danych. Dane często są licz-
bami, na przykład reprezentują ceny akcji, temperatury dzienne, ruch klientów itp.
Bardzo często trzeba przetworzyć te dane lub też narysować wykres na ich podstawie.
Na przykład aplet może wyświetlać średnią cenę akcji w przeciągu ostatnich kilku
miesięcy i rysować wykres prezentujący zmiany ceny. Statystyka i wykresy bardzo
często pojawiają się w trakcie pisania programów w Javie, zatem zajmiemy się nimi
w tym rozdziale.
W tym rozdziale zostanie pokazane wykonanie metody służącej do obliczania nastę-
pujących statystyk:
średniej;
mediany;
dominanty (mody, wartości modalnej);
odchylenia standardowego;
równania regresji (linia najlepszego dopasowania);
współczynnika korelacji.
W tym rozdziale pokażemy także sposób rysowania wykresów. Przykłady tutaj przed-
stawione każdy może dostosować do własnych potrzeb.
W niniejszym rozdziale szczególny nacisk zostanie położony na dwa aspekty: obli-
czenia matematyczne i wyświetlanie uzyskanych wyników w sposób graficzny. Java
nie jest zoptymalizowana pod kątem obliczeń matematycznych ale wspiera różne
metody obliczeń. Choć obliczenia pokazane w tym rozdziale nie wymagają dużej
mocy procesora ani nie są wysoce złożone, stanowią dobrą ilustrację możliwych spo-
sobów radzenia sobie z danymi.
214
Java. Sztuka programowania
Java od samego początku była zaprojektowana jako język zapewniający interfejs gra-
ficzny. Z tego powodu istnieje wiele klas zajmujących się interfejsami graficznymi. Java
posiada aktualnie dwa systemy graficznych interfejsów użytkownika: AWT i Swing.
System Swing był dosyć intensywnie opisywany w poprzednich rozdziałach, zatem
teraz warto zapoznać się z systemem AWT. Czytelnik dowie się, w jaki sposób można
tworzyć okna AWT, jak zapewnia się obsługę zmiany ich rozmiaru, ponowne ryso-
wanie okna i inne elementy. Java posiada unikalne cechy, takie jak klasy wewnętrzne
i adaptory, zatem kod interfejsu graficznego w tym języku jest bardziej elegancki i krót-
szy od tego samego kodu uzyskiwanego w innych językiach.
Próbki, zbiory, rozkład i zmienne
Przed rozpoczęciem omawiania właściwego programu należy zdefiniować kilka pod-
stawowych terminów i koncepcji związanych ze statystyką. Ogólnie informacje staty-
styczne otrzymuje się w postaci próbek. Następnie dokonuje się uogólnienia wyników.
Każda z próbek pochodzi z określonego zbioru wartości przewidzianych dla danej
sytuacji. Stosuje tu się po prostu nazwę zbiór. Na przykład można szacować wielkość
produkcji fabryki zapałek w przeciągu całego roku, uogólniając dane zebrane tylko
w jednym dniu. W ten sposób można dokonać ekstrapolacji dotyczącej całego roku na
podstawie znacznie skromniejszej informacji.
Jeżeli próbka jest wyczerpująca, jest równa całemu zbiorowi. W przypadku omawia-
nej, przykładowej fabryki, jeśli próbka zawiera wielkość produkcji fabryki dla całego
roku, wtedy jest ona równa całemu zbiorowi. Jeśli próbka jest mniejsza od całego zbioru,
jest możliwe wystąpienie błędu. Wtedy należy znać współczynnik określający wielkość
błędu. Na potrzeby niniejszego rozdziału zakłada się, iż próbka jest równa zbiorowi,
więc nie występują błędy statystyczne.
Informacje statystyczne zależą od rozkładu zmiennych losowych w zbiorze. Możliwych
jest kilka różnych rodzajów rozkładów prawdopodobieństwa przyjmowania wartości
przez zmienne losowe. Najbardziej znanym jest rozkład normalny, czyli rozkład Gaussa,
którego reprezentacją jest tzw. krzywa dzwonowa. Rozkład analizowanych wartości
przyjmuje kształt symetrycznego dzwonu. Oznacza to, że zmienne losowe o wartości
zbliżonej do przeciętnej występują najczęściej.
W trakcie badania statystycznego określa się zmienne zależne (badane) i zmienne
niezależne (ich wartość pozwala wyliczyć zmienną zależną). W tym rozdziale zmienną
niezależną jest czas. Zmienna ta jest zwiększana w każdym roku o wartość jednost-
kową. Zastosowanie czasu jako zmiennej niezależnej jest powszechnym zjawi-
skiem. Na przykład przy badaniu kursów stosuje się zmienną niezależną z odstę-
pem jeden dzień.
Rozdział 8. ♦ Statystyka i wykresy
215
Podstawy statystyki
U podstawy większości analiz statystycznych występują trzy parametry badanych prób:
średnia, mediana i moda (dominanta). Każdy z wymienionych współczynników jest
użyteczny ale dopiero ich połączenie pozwala na dokładne przeanalizowanie charak-
terystyki próbki.
Metody statystyczne opisywane w niniejszym rozdziale opierają się na założeniu, iż
zmienne losowe, składające się na próbkę znajdują się w tablicy zmiennych typu FQWDNG.
Wszystkie metody statystyczne są metodami typu UVCVKE przechowywanymi w klasie
5VCVU. Klasę tą w całości przedstawimy w dalszej części rozdziału. Prezentowane metody
są typu UVCVKE, zatem można je wywołać bez potrzeby tworzenia obiektiu 5VCVU.
Średnia
Średnia jest najczęściej wykorzystywaną funkcją w statystyce. Zapewnia obliczanie
wartości średniej arytmetycznej podanego zbioru zmiennych losowych. W ten sposób
znajduje się niejako „środek ciężkości” zestawu danych. Aby obliczyć średnią aryt-
metyczną danego zbioru liczb, należy zsumować wszystkie jego elementy i otrzymaną
sumę podzielić przez liczbę elementów. Na przykład suimą dla wartości
1 2 3 4 5 6 7 8 9 10
jest 55. Podzielenie tej wartości przez liczbę elementów w próbce (10), prowadzi do
uzyskania wyniku 5.5. Wzór na średnią arytmetyczną jeist następujący.
W tym wzorze Di reprezentuje element danych, natomiast N jest liczbą elementów
(zmiennych losowych) w próbce.
Poniższa metoda o nazwie OGCP
oblicza średnią dla wartości przekazanych w tablicy
jako parametr. Metoda zwraca średnią arytmetyczną.
YTCECħTGFPKæRQFCP[EJYCTVQħEK
RWDNKEUVCVKEFQWDNGOGCP
FQWDNG=?XCNU]
FQWDNGCXI
HQT
KPVKKXCNUNGPIVJK
CXI
XCNU=K?
CXIXCNUNGPIVJ
TGVWTPCXI
_
Aby użyć metody OGCP
, wystarczy tylko przekazać referencję do tablicy zawierającej
zbiór wartości. Jako wynik wykonania metody otrzymuje się wartość średniej arytme-
tycznej elementów przekazanej tablicy.
216
Mediana
Java. Sztuka programowania
Mediana próbki jest określana jako wartość środkowa dla uporządkowanego rosnąco
ciągu wartości. Na przykład dla zbioru
1 2 3 4 5 6 7 8 9
wartość mediany wynosi 5. W przypadku parzystej liczby elementów medianą jest
średnia arytmetyczna dwóch środkowych wartości. Na iprzykład dla zbioru
1 2 3 4 5 6 7 8 9 10
wartość mediany wynosi 5.5. W przypadku próbek o rozkładzie normalnym wartości
mediany i średniej są podobne. Im jednak rozkład próbki będzie bardziej odbiegał od
rozkładu normalnego, tym różnica między medianą a śirednią będzie większa.
Najprostszym sposobem otrzymania mediany z próbki jest posortowanie danych a następ-
nie pobranie środkowej wartości. Oto sposób działania imetody OGFKCP
.
YTCECOGFKCPúRQFCP[EJYCTVQħEK
RWDNKEUVCVKEFQWDNGOGFKCP
FQWDNG=?XCNU]
FQWDNGVGOR=?PGYFQWDNG=XCNUNGPIVJ?
5[UVGOCTTC[EQR[
XCNUVGORXCNUNGPIVJ
#TTC[UUQTV
VGORUQTVQYCPKGFCP[EJ
YTÎEGPKGYCTVQħEKħTQFMQYGL
KH
XCNUNGPIVJ]
,GħNKPKGRCT[UVCNKEDCYCTVQħEKPCLFļħTGFPKæF
TGVWTP
VGOR=VGORNGPIVJ?
VGOR=
VGORNGPIVJ?
_GNUGTGVWTP
VGOR=VGORNGPIVJ?
_
Aby użyć metody OGFKCP
, wystarczy tylko przekazać referencję do tablicy zawie-
rającej zbiór wartości. Jako wynik wykonania metody oitrzymuje się wartość mediany.
Warto zauważyć, iż prezentowana metoda wykonuje kopię przekazanej tablicy za
pomocą polecenia 5[UVGOCTTC[EQR[
. Sortowaniu podlega właśnie kopia. W ten
sposób przekazana tablica nie ulega modyfikacji. Zachowanie oryginalnej kolejności
jest bardzo ważne, na przykład w przypadku tworzeniai wykresu.
Moda (dominanta)
Moda próbki jest wartością najczęściej występującą w zbiiorze. Na przykład dla próbki
1 2 3 3 4 5 6 7 7 7 8 9
modą jest wartość 7, ponieważ występuje najczęściej. Moda nie musi być unikalna.
Na przykład w sytuacji
10 20 30 30 40 50 60 60 70
Rozdział 8. ♦ Statystyka i wykresy
217
zarówno wartość 30, jak i 60 występuje po dwa razy. Każda z tych wartości jest modą.
Taki zbiór nazywany jest bimodalnym. Zbiór zawierający tylko jedną modą jest zbiorem
unimodalnym. W prezentowanych przykładach zostanie zastosowane podejście, w któ-
rym w przypadku wielu wartości mody zostanie zwrócona tylko pierwsza z nich. Jeżeli
żadna z wartości nie występuje częściej od innych, piróbka nie posiada mody.
Poniższa metoda OQFG
znajduje modę zbioru.
YTCECOQFú
FQOKPCPVúFNCRQFCP[EJYCTVQħEK
9[LæVGM0Q/QFG ZEGRVKQPLGUVIđCUCP[YVGF[IF[
ľCFPCNKEDPKGY[UVúRWLGEúħEKGLQFRQQUVCđ[EJ
)F[FYKGNWDYKúEGLYCTVQħEKRQLCYKCUKúTÎYPKGEúUVQF
YTCECPCLGUVV[NMQRKGTYUCPKEJ
RWDNKEUVCVKEFQWDNGOQFG
FQWDNG=?XCNU
VJTQYU0Q/QFG ZEGRVKQP
]
FQWDNGOOQFG8CN
KPVEQWPVQNFEQWPV
HQT
KPVKKXCNUNGPIVJK
]
OXCNU=K?
EQWPV
NKECPKGY[UVúRQYCPKCRQUEGIÎNP[EJYCTVQħEKF
HQT
KPVLK
LXCNUNGPIVJL
KH
OXCNU=L?EQWPV
,GħNKVCYCTVQħèY[UVúRWLGEúħEKGLPKľRQRTGFPKG
CRCOKúVCLLæ
KH
EQWPV QNFEQWPV]
OQFG8CNO
QNFEQWPVEQWPV
_
_
KH
QNFEQWPV
VJTQYPGY0Q/QFG ZEGRVKQP
GNUG
TGVWTPOQFG8CN
_
Metoda OQFG
zlicza najpierw liczbę wystąpień poszczególnych wartości w tablicy
XCNU. Jeżeli znajdzie wartość występującą więcej razy niż poprzednia, zapamiętuje
nową wartość w OQFG8CN. Po zakończeniu procesu najczęściej występująca wartość
znajduje się w zmiennej OQFG8CN i jest ona zwracana. W przypadku wstępowania wielu
wartości mody, metoda zwraca tylko pierwszą. Jeżeli próbka nie zawiera dominanty,
następuje zgłoszenie wyjątku 0Q/QFG ZEGRVKQP. Oto postać klasy 0Q/QFG ZEGRVKQP.
9[LæVGMIđCUCP[RTG/QFG
ENCUU0Q/QFG ZEGRVKQPGZVGPFU ZEGRVKQP]
RWDNKE5VTKPIVQ5VTKPI
]
TGVWTP DKÎTPKGCYKGTCOQF[
_
_
218
Java. Sztuka programowania
Wariancje i odchylenie standardowe
Choć podsumowanie zbioru zmiennych losowych jedną wartością, taką jak średnia lub
mediana wydaje się być bardzo przekonujące, takie podejście nie zapewnia możliwości
wykonania wyczerpującej analizy danych. Czasem nawet takie rozwiązanie może być
mylące. Jeżeli próbka zawiera na przykład wartości skrajne, wtedy średnia i mediana
nie reprezentuje jej w wystarczający sposób. Oto przykłiad
10 11 9 1 0 2 3 12 11 10
Średnia wynosi 6,9, ale wartość ta raczej jest niedostateczną reprezentacją próbki, po-
nieważ żadna ze zmiennych losowych nie jest nawet w przybliżeniu równa średniej.
Problem polega na tym, iż średnia nie przekazuje informacji na temat wariacji lub roz-
kładu danych. Dobrze jest znać odstępy pomiędzy wartościami poszczególnych zmien-
nych losowych. W ten sposób lepiej można zinterpretowiać średnią, medianę i modę.
Aby znaleźć stopień zmienności próbki, trzeba obliczyć odchylenie standardowe. Od-
chylenie standardowe uzyskiwane jest po obliczeniu wariancji. Obie wartości określają
rozkład danych w zbiorze. Z tych dwóch współczynników odchylenie standardowe
jest ważniejsze, gdyż wyznacza średnią odległość pomiędzy wartościami zmiennych
losowych a średnią.
Wariancję oblicza się z następującego wzoru.
W powyższym wzorze N jest liczbą elementów, M jest średnią a Di — to wartości
poszczególnych zmiennych losowych w próbie. Konieczne jest podnoszenie wyniku
do kwadratu, aby uzyskiwać tylko wartości dodatnie. Jeżeli wzór nie uwzględniałby
podnoszenia do kwadratu, wynik często wynosiłby zerio.
Odchylenie standardowe znajduje się obliczając pierwiastek kwadratowy wariancji.
Z tego powodu wzór na odchylenie standardowe ma nasitępującą postać.
Jak już wspomniano wcześniej, odchylenie standardowe jest bardziej przydatne od
wariancji. Warto rozważyć następujący zbiór:
11 20 40 30 99 30 50
Wariancję określa się jako średnią arytmetyczną kwadratów odchyleń poszczególnych
wartości zmiennych od ich wartości średniej (zobacz tiabelę na następnej stronie).
Z powyższej tabeli wynika, iż średnia kwadratów różnic wartości zmiennych losowych
od ich wartości średniej wynosi 717,43. Aby znaleźć teraz odchylenie standardowe,
wystarczy znaleźć pierwiastek kwadratowy wariancji. Wynosi on około 26,78. Od-
chylenie standardowe określa średnią odległość poszczególnych punktów od średniej
wartości wszystkich elementów.
Rozdział 8. ♦ Statystyka i wykresy
219
Di
11
20
40
30
99
30
50
Di–M
–29
–20
0
–10
59
–10
10
Suma:
Średnia sumy:
(Di–M)2
841
400
0
100
3481
100
100
5022
717.43
Odchylenie standardowe informuje o tym, czy wartość średniej dla elementów dobrze
reprezentuje zbiór. Jeśli na przykład kupiono fabrykę batoników a kierownik informuje
o tym, iż w poprzednim miesiącu wyprodukowano średnio 2 500 batoników dziennie
ale odchylenie standardowe wyniosło 2 000, należy się zastanowić nad poprawą linii
produkcyjnej.
Oto bardzo ważna zasada. Przy założeniu, iż dane stosują się do rozkładu normalnego,
około 68 zmiennych losowych znajdzie się w pojedynczym odchyleniu standardowym
od średniej a koło 95 znajdzie się w podwójnym odchyleiniu standardowym.
Przedstawiona poniżej metoda UVF GX
oblicza odchylenie standardowe dla tablicy
wartości.
YTCECQFEJ[NGPKGUVCPFCTFQYGDKQTWYCTVQħEK
RWDNKEUVCVKEFQWDNGUVF GX
FQWDNG=?XCNU]
FQWDNGUVF
FQWDNGCXIOGCP
XCNU
HQT
KPVKKXCNUNGPIVJK
UVF
XCNU=K?CXI
XCNU=K?CXI
UVFXCNUNGPIVJ
UVF/CVJUSTV
UVF
TGVWTPUVF
_
Równanie regresji
Jednym z najczęstszych zastosowań statystyki jest prognozowanie przyszłości. Choć
dane pochodzące z przeszłości nie zawsze pozwalają na przewidywanie przyszłości,
często korzysta się z tak zwanej analizy trendu. Prawdopodobnie najbardziej rozpo-
wszechnionym narzędziem do tego rodzaju analizy jest równanie regresji. Równanie
to opisuje związek dwóch wartości, które wchodzą w iskład dwuwymiarowej zmiennej
losowej. Często linię tę nazywa się linią najmniejszych kwadratów.
220
Java. Sztuka programowania
Przed zaprezentowaniem odpowiedniego wzoru warto przypomnieć, iż linia prosta
w dwóch wymiarach jest opisywana następującym równaniem
Y = a + bX
W tym przypadku X jest zmienną niezależną, Y jest zmienną zależną, a opisuje wartość
przesunięcia na osi Y a b — stopień nachylenia linii. Aby w pełni określić położenie
linii w układzie współrzędnych, trzeba odnaleźć wartoiści współczynników a i b.
Aby znaleźć równanie regresji, można skorzystać z metody najmniejszych kwadratów.
Ogólnie pomysł polega na tym, by odnaleźć linię, która zminimalizuje sumę kwadratów
odchyleń między poszczególnymi danymi a linią. Znalezienie tego równania wymaga
dwóch kroków. Najpierw oblicza się wartość b, używając wzoru:
W powyższym wzorze Mx jest wartością średnią współrzędnej X, My — średnią współ-
rzędnej Y. Po obliczeniu b wartość a oblicza się z następującego wzoru.
a = My – bMx
Po określeniu równania regresji liniowej można użyć dowolnej wartości X i wskazać
dla niej przewidywaną wartość Y.
Aby zrozumieć znaczenie linii regresji, można rozważyć następujący przykład. Załóżmy,
że mamy dostęp do średnich wartości akcji firmy XYZ w przeciągu ostatnich 10 lat.
Oto zebrane dane:
Rok
0
1
2
3
4
5
6
7
8
9
Cena
68
75
74
80
81
85
82
87
91
94
Równanie regresji dla tych danych jest następujące.
Y = 70,22 + 2,55 X
Rozdział 8. ♦ Statystyka i wykresy
221
Dane i linię regresji przedstawiono na rysunku 8.1. Jak wynika z rysunku, linia regre-
sji jest nachylona do góry. Oznacza to tendencję wzrostową akcji firmy XYZ. Warto
także zauważyć, iż punkty reprezentujące zmienne losowe (dane) są położone bardzo
blisko linii regresji. Analizując przebieg linii można przewidzieć, iż w roku 11 cena
akcji wzrośnie do 98,27. Aby uzyskać tę wartość, wystarczy w równaniu regresji za-
miast X wstawić wartość 11. Oczywiście rozwiązanie to ma jedną wadę — to tylko
przewidywanie. Nie ma gwarancji, iż rzeczywiście cena akcji za dwa lata będzie do-
kładnie taka.
Rysunek 8.1.
Wykres średnich cen
i linia regresji
Współczynnik korelacji
Choć linia regresji z rysunku 8.1 wydaje się wskazywać tendencję wzrostową, nie wia-
domo, z jakim stopniem dokładności odwzorowuje ona zebrane dane. Jeżeli dane i linia
regresji są ze sobą słabo powiązane, wykres regresji liniowej nie jest dobrym wskaź-
nikiem. Jeżeli jednak punkty reprezentujące dane leżą dokładnie na linii wykresu, ma
on dużą wartość.
Aby określić znaczenie otrzymanej linii regresji, najczęściej oblicza się współczynnik
korelacji, który może przyjmować wartości od –1 do 1. Współczynnik ten opisuje siłę
liniowego związku między dwiema zmiennymi. Brzmi to być może dziwnie, ale jest
to bardzo proste zagadnienie. Graficznie współczynnik korelacji jest związany z odle-
głością poszczególnych punktów reprezentujących dane (zmienne losowe) od linii,
stanowiącej wykres regresji. Jeżeli współczynnik wynosi 1, dane są doskonale dopa-
sowane do linii (doskonała korelacja dodatnia). Wartość 0 oznacza brak związku
między linią a danymi (w takim przypadku każda dowolna linia prosta byłaby równie
dobra jak rozważana). Znak korelacji jest taki sam jak współczynnik nachylenia linii
(wartość b). Jeżeli współczynnik ten jest dodatni, oznacza to bezpośredni związek
zmiennej zależnej od zmiennej niezależnej. Dla ujemnego współczynnika występuje
związek odwrotny.
Wzór służący do obliczania współczynnika korelacji jeist następujący.
222
Java. Sztuka programowania
We wzorze Mx oznacza średnią współrzędnej X, My — średnią współrzędnej Y. Znak
współczynnika zależy od nachylenia linii regresji. Ogólnie wartość wynosząca 0,81
lub więcej jest traktowana jako silny związek. Oznacza to, iż około 66 danych jest
dopasowanych do linii regresji. Aby zamienić współczynnik na wartość procentową,
wystarczy podnieść go do kwadratu i pomnożyć przez 100. Uzyskana w ten sposób
wartość jest nazywana współczynnikiem determinacji.
Metoda TGITGUU
przedstawiona poniżej oblicza równanie regresji oraz współczyn-
nik korelacji.
1DNKECPKGTGITGULKKYURÎđE[PPKMMQTGNCELK
FNCRQFCPGIQDKQTWYCTVQħEK9CTVQħEKTGRTGGPVWLæF
YURÎđTúFPæ;9URÎđTúFPæ:LGUVECU
KPMTGOGPVCELCQLGFGPYMCľF[OMTQMW
RWDNKEUVCVKE4GI CVCTGITGUU
FQWDNG=?XCNU]
FQWDNGCD[#XIZ#XIVGORVGOREQT
FQWDNGXCNU=?PGYFQWDNG=XCNUNGPIVJ?
7VYQTGPKGHQTOCVWNKEDQYGIQFYQOCE[HTCOKRQRFTGEKPMW
0WODGT(QTOCVPH0WODGT(QTOCVIGV+PUVCPEG
PHUGV/CZKOWO(TCEVKQP KIKVU
PCNGKGPKGħTGFPKGLYCTVQħEK;
[#XIOGCP
XCNU
PCNGKGPKGħTGFPKGLMQORQPGPVW:
Z#XI
HQT
KPVKKXCNUNGPIVJK
Z#XI
K
Z#XIXCNUNGPIVJ
PCNGKGPKGD
VGORVGOR
HQT
KPVKKXCNUNGPIVJK
]
VGOR
XCNU=K?[#XI
KZ#XI
VGOR
KZ#XI
KZ#XI
_
DVGORVGOR
PCNGKGPKGC
C[#XI
DZ#XI
1DNKEGPKGYURÎđE[PPKMÎYMQTGNCELK
HQT
KPVKKXCNUNGPIVJK
XCNU=K?K
EQTVGORXCNUNGPIVJ
EQTUVF GX
XCNUUVF GX
XCNU
TGVWTPPGY4GI CVC
CDEQT;
PHHQTOCV
C
PHHQTOCV
D
:
_
Należy podkreślić, iż metoda opiera się na założeniu, że zmienną niezależną (X) jest
czas. Z tego powodu w każdym kroku zwiększa wartość tej zmiennej o 1. Średnia
wartości X jest obliczana następującymi poleceniami.
Rozdział 8. ♦ Statystyka i wykresy
223
PCNGKGPKGħTGFPKGLMQORQPGPVW:
Z#XI
HQT
KPVKKXCNUNGPIVJK
Z#XI
K
Z#XIXCNUNGPIVJ
Wartości od 0 do liczby elementów są ze sobą sumowane a następnie wynik tej operacji
jest dzielony przez liczbę elementów. W ten sposób poiwstaje średnia X.
Oś X oznacza czas, zatem często taką analizę nazywa się analizą czasową. Wartością
odniesienia podczas próbkowania jest czas, zatem do metody przekazuje się tylko jedną
tablicę. Możliwe jest stosowanie dwóch tablic: jednej dla wartości X i jednej dla warto-
ści Y, ale taki sposób działania nie jest rozpatrywaniy w niniejszym rozdziale.
Metoda TGITGUU
zwraca wartości a i b, tekstową reprezentację równania regresji
i współczynnik korelacji, wszystkie dane zostają umieszczone w obiekcie 4GI CVC.
Klasę tego obiektu przedstawiono poniżej.
6CMNCUCRTGEJQYWLGFCPGCPCNK[TGITGU[LPGL
ENCUU4GI CVC]
RWDNKEFQWDNGCD
RWDNKEFQWDNGEQT
RWDNKE5VTKPIGSWCVKQP
RWDNKE4GI CVC
FQWDNGKFQWDNGLFQWDNGM5VTKPIUVFT]
CK
DL
EQTM
GSWCVKQPUVT
_
_
Cała klasa Stats
Wszystkie metody statystyczne znajdują się w jednej klasie 5VCVU, której kod przed-
stawiono poniżej. W tym samym pliku źródłowym umieszczono także klasy 4GI CVC
i 0Q/QFG ZEGRVKQP.
KORQTVLCXCWVKN
KORQTVLCXCVGZV
6CMNCUCRTGEJQYWLGFCPGCPCNK[TGITGU[LPGL
ENCUU4GI CVC]
RWDNKEFQWDNGCD
RWDNKEFQWDNGEQT
RWDNKE5VTKPIGSWCVKQP
RWDNKE4GI CVC
FQWDNGKFQWDNGLFQWDNGM5VTKPIUVFT]
CK
DL
EQTM
GSWCVKQPUVT
_
_
224
Java. Sztuka programowania
9[LæVGMIđCUCP[RTG/QFG
ENCUU0Q/QFG ZEGRVKQPGZVGPFU ZEGRVKQP]
RWDNKE5VTKPIVQ5VTKPI
]
TGVWTP DKÎTPKGCYKGTCOQF[
_
_
1IÎNPCMNCUCUVCV[UV[M
RWDNKEENCUU5VCVU]
YTCECħTGFPKæRQFCP[EJYCTVQħEK
RWDNKEUVCVKEFQWDNGOGCP
FQWDNG=?XCNU]
FQWDNGCXI
HQT
KPVKKXCNUNGPIVJK
CXI
XCNU=K?
CXIXCNUNGPIVJ
TGVWTPCXI
_
YTCECOGFKCPúRQFCP[EJYCTVQħEK
RWDNKEUVCVKEFQWDNGOGFKCP
FQWDNG=?XCNU]
FQWDNGVGOR=?PGYFQWDNG=XCNUNGPIVJ?
5[UVGOCTTC[EQR[
XCNUVGORXCNUNGPIVJ
#TTC[UUQTV
VGORUQTVQYCPKGFCP[EJ
YTÎEGPKGYCTVQħEKħTQFMQYGL
KH
XCNUNGPIVJ]
,GħNKPKGRCT[UVCNKEDCYCTVQħEKPCLFļħTGFPFKæ
TGVWTP
VGOR=VGORNGPIVJ?
VGOR=
VGORNGPIVJ?
_GNUGTGVWTP
VGOR=VGORNGPIVJ?
_
YTCECOQFú
FQOKPCPVúFNCRQFCP[EJYCTVQħEK
9[LæVGM0Q/QFG ZEGRVKQPLGUVIđCUCP[YVGF[IF[
ľCFPCNKEDPKGY[UVúRWLGEúħEKGLQFRQQUVCđ[EJ
)F[FYKGNWDYKúEGLYCTVQħEKRQLCYKCUKúTÎYPKGEúUVQ
YTCECPCLGUVV[NMQRKGTYUCPKEJ
RWDNKEUVCVKEFQWDNGOQFG
FQWDNG=?XCNU
VJTQYU0Q/QFG ZEGRVKQP
]
FQWDNGOOQFG8CN
KPVEQWPVQNFEQWPV
HQT
KPVKKXCNUNGPIVJK
]
OXCNU=K?
EQWPV
NKECPKGY[UVúRQYCēRQUEGIÎNP[EJYCTVQħEK
HQT
KPVLK
LXCNUNGPIVJL
KH
OXCNU=L?EQWPV
Rozdział 8. ♦ Statystyka i wykresy
225
,GħNKVCYCTVQħèY[UVúRWLGEúħEKGLPKľRQRTGFPKFG
CRCOKúVCLLæ
KH
EQWPV QNFEQWPV]
OQFG8CNO
QNFEQWPVEQWPV
_
_
KH
QNFEQWPV
VJTQYPGY0Q/QFG ZEGRVKQP
GNUG
TGVWTPOQFG8CN
_
YTCECQFEJ[NGPKGUVCPFCTFQYGDKQTWYCTVQħEKF
RWDNKEUVCVKEFQWDNGUVF GX
FQWDNG=?XCNU]
FQWDNGUVF
FQWDNGCXIOGCP
XCNU
HQT
KPVKKXCNUNGPIVJK
UVF
XCNU=K?CXI
XCNU=K?CXI
UVFXCNUNGPIVJ
UVF/CVJUSTV
UVF
TGVWTPUVF
_
1DNKECPKGTGITGULKKYURÎđE[PPKMCMQTGNCELK
FNCRQFCPGIQDKQTWYCTVQħEK9CTVQħEKTGRTGGPVFWLæ
YURÎđTúFPæ;9URÎđTúFPæ:LGUVECU
KPMTGOGPVCELCQLGFGPYMCľF[OMTQMW
RWDNKEUVCVKE4GI CVCTGITGUU
FQWDNG=?XCNU]
FQWDNGCD[#XIZ#XIVGORVGOREQT
FQWDNGXCNU=?PGYFQWDNG=XCNUNGPIVJ?
7VYQTGPKGHQTOCVWNKEDQYGIQFYQOCE[HTCOKRQFRTGEKPMW
0WODGT(QTOCVPH0WODGT(QTOCVIGV+PUVCPEG
PHUGV/CZKOWO(TCEVKQP KIKVU
PCNGKGPKGħTGFPKGLYCTVQħEK;
[#XIOGCP
XCNU
PCNGKGPKGħTGFPKGLMQORQPGPVW:
Z#XI
HQT
KPVKKXCNUNGPIVJK
Z#XI
K
Z#XIXCNUNGPIVJ
PCNGKGPKGD
VGORVGOR
HQT
KPVKKXCNUNGPIVJK
]
VGOR
XCNU=K?[#XI
KZ#XI
VGOR
KZ#XI
KZ#XI
_
DVGORVGOR
226
Java. Sztuka programowania
PCNGKGPKGC
C[#XI
DZ#XI
1DNKEGPKGYURÎđE[PPKMÎYMQTGNCELK
HQT
KPVKKXCNUNGPIVJK
XCNU=K?K
EQTVGORXCNUNGPIVJ
EQTUVF GX
XCNUUVF GX
XCNU
TGVWTPPGY4GI CVC
CDEQT;
PHHQTOCV
C
PHHQTOCV
D
:
_
_
Tworzenie wykresów
Choć statystyka jest użyteczna sama w sobie, nie zawsze daje pełny obraz sytuacji.
W wielu przypadkach pożądane jest przedstawienie danych w postaci graficznej.
Pokazanie danych na wykresie pozwala od razu zauważyć związki i anomalie, które
nie zawsze są oczywiste po przeanalizowaniu statystyk. Poza tym wykres dokładnie
obrazuje rozkład i zmienność danych. Z powodu dużego znaczenia wykresów w staty-
styce, w tym podrozdziale zostanie zaprezentowany kod rysujący trzy rodzaje wykresów.
Poza samym wyświetlaniem wykresów, przedstawiony w tym podrozdziale kod obra-
zuje także zasady korzystania z systemu AWT i obsługi zdarzeń. AWT stanowi część
podstawowej biblioteki klas Javy. Zapewnia okienkowe, graficzne środowisko inter-
fejsu użytkownika. Aplikacje z takim interfejsem komunikują się z użytkownikiem za
pomocą zdarzeń. Zdarzeniem może być naciśnięcie przycisku na klawiaturze, wybra-
nie polecenia z menu a także zmiana rozmiaru okna. W trakcie omawiania różnych
metod rysowania wskażemy także kilka aspektów związanych ze środowiskiem inter-
fejsu graficznego. Na przykład trzeba umożliwić dynamiczne skalowanie wykresu,
ponieważ użytkownik może dowolnie zmienić rozmiar oikna.
W tym rozdziale zostanie zaprezentowane wykonanie trzech rodzajów wykresów. Pierw-
szym z nich jest wykres słupkowy, drugi to wykres punktowy a trzeci — to wykres
punktowy z linią regresji. Jak będzie się można przekonać, większość kodu, na przy-
kład ten zapewniający skalowanie, jest taka sama dlai wszystkich wykresów.
Skalowanie danych
Aby metoda rysowania mogła obsługiwać dowolne jednostki wielkości, potrzebne jest
odpowiednie skalowanie danych. Skalowanie musi być powiązane z aktualnym roz-
miarem okna. Co więcej, skalowanie musi się odbywać dynamicznie. Każda zmiana
rozmiaru okna powinna powodować dostosowanie skali.i
Proces skalowania wymaga znalezienia stosunku między zakresem danych a fizycznymi
wymiarami okna. Gdy odnajdzie się ten współczynnik, dane można rysować, mnożąc
Rozdział 8. ♦ Statystyka i wykresy
227
przez niego poszczególne wartości. W ten sposób uzyskuje się wartości współrzędnych
wewnątrz okna. Oto przykład wzoru na skalowanie dlai osi Y.
Y = Y * (szerokość_okna / (max – min))
gdzie Y jest skalowaną wartością, opisująca położeniei wewnątrz okna.
Choć przedstawiony wzór jest bardzo prosty, pojawiają się komplikacje związane ze
środowiskiem graficznym. Na przykład szerokość okna trzeba pobierać za każdym
razem, gdy następuje ponowne rysowanie wykresu, gdyż szerokość ta mogła ulec
zmianie. Co więcej, od łącznej szerokości okna trzeba odjąć szerokość obramowania
okna. Trzeba także uwzględnić opis wykresu. W ten sposób skalowanie wymaga wyko-
nania kilku kroków, ale nie są one szczególnie złożione.
Klasa Graphs
Metody rysowania wykresów znajdują się w klasie )TCRJU. Klasa ta rozszerza klasę
(TCOG. Z tego powodu wykresy znajdują się wewnątrz głównych okien. Czyni to wykresy
niezależnymi i łatwo skalowalnymi. Można na przykład wyświetlić wykres a następ-
nie go zminimalizować bez chowania całej aplikacji.
Poniżej znajduje się pełny kod klasy )TCRJU. Klasę tę dokładniej opisano w dalszej
części rozdziału.
KORQTVLCXCCYV
KORQTVLCXCCYVGXGPV
KORQTVLCXCCRRNGV
KORQTVLCXCWVKN
1IÎNPCMNCUCT[UQYCPKCY[MTGUÎY
RWDNKEENCUU)TCRJUGZVGPFU(TCOG]
5VCđGTQFCLÎYY[MTGUÎY
RWDNKEHKPCNUVCVKEKPV$#4
RWDNKEHKPCNUVCVKEKPV5 #66 4
RWDNKEHKPCNUVCVKEKPV4 )2.16
RTKXCVGKPVITCRJ5V[NG
1MTGħNCKNQħèOKGLUECFQRQQUVCYKGPKC
OKúF[QDUCTGOFCP[EJCMTCYúFKæ
RTKXCVGHKPCNKPVNGHV)CR
RTKXCVGHKPCNKPVVQR)CR
RTKXCVGHKPCNKPVDQVVQO)CR
RTKXCVGKPVTKIJV)CRQDNKECPKGVGLYCTVQħEK
2TGEJQYWLGYCTVQħèOKPKOCNPæKOCMU[OCNPæFCP[EJF
RTKXCVGFQWDNGOKPOCZ
1FPKGUKGPKGUKúFQFCP[EJ
RTKXCVGFQWDNG=?FCVC
-QNQT[Y[MTGUW
QNQTITKF QNQTPGY QNQT
QNQTFCVC QNQTPGY QNQT
228
Java. Sztuka programowania
4ÎľPGYCTVQħEKWľ[YCPGFQUMCNQYCPKCKY[ħYKGVNCPFKCFCP[EJ
RTKXCVGKPVJ)CRQFUVúROKúF[RWPMVCOKFCP[EJ
RTKXCVGKPVURTGCFQFUVúROKúF[YCTVQħEKCOKOKPFKOCZ
RTKXCVGFQWDNGUECNGYURÎđE[PPKMUMCNQYCPKC
RTKXCVGKPVDCUGNKPGRKQPQY[YURÎđE[PPKMRQFUVCY[
.QMCNKCELCQDUCTWFCP[EJYQMPKG
RTKXCVGKPVVQRDQVVQONGHVTKIJV
RWDNKE)TCRJU
FQWDNG=?XCNUKPVUV[NG]
1DUđWICFCTGēCOMPKúEKCQMPC
CFF9KPFQY.KUVGPGT
PGY9KPFQY#FCRVGT
]
RWDNKEXQKFYKPFQY NQUKPI
9KPFQY XGPVYG]
UGV8KUKDNG
HCNUG
FKURQUG
_
_
1DUđWICOKCP[TQOKCTW
CFF QORQPGPV.KUVGPGT
PGY QORQPGPV#FCRVGT
]
RWDNKEXQKFEQORQPGPV4GUKGF
QORQPGPV XGPVEGF]
TGRCKPV
_
_
ITCRJ5V[NGUV[NG
FCVCXCNU
5QTVQYCPKGFCP[EJYEGNWPCNGKGPKCYCTVQħEKFOKPKOCZ
FQWDNGV=?PGYFQWDNG=XCNUNGPIVJ?
5[UVGOCTTC[EQR[
XCNUVXCNUNGPIVJ
#TTC[UUQTV
V
OKPV=?
OCZV=VNGPIVJ?
UGV5KG
PGY KOGPUKQP
UYKVEJ
ITCRJ5V[NG]
ECUG$#4
UGV6KVNG
9[MTGUUđWRMQY[
UGV.QECVKQP
DTGCM
ECUG5 #66 4
UGV6KVNG
9[MTGURWPMVQY[
UGV.QECVKQP
DTGCM
ECUG4 )2.16
UGV6KVNG
9[MTGUTGITGULK
UGV.QECVKQP
DTGCM
_
UGV8KUKDNG
VTWG
_
Rozdział 8. ♦ Statystyka i wykresy
229
RWDNKEXQKFRCKPV
)TCRJKEUI]
KOGPUKQPYKP5KGIGV5KG
TQOKCTQMPC
+PUGVUKPUIGV+PUGVU
TQOKCTITCPKE
4QOKCTCMVWCNPKGUVQUQYCPGLEEKQPMK
(QPV/GVTKEUHOIIGV(QPV/GVTKEU
1DNKEGPKGQFRQYKGFPKGIQQFUVúRW
TKIJV)CRHOUVTKPI9KFVJ
FCVCNGPIVJ
1DNKEGPKGYU[UVMKEJRTGTYFNCFCPGIQTGIKQPWF
NGHVKPUNGHV
NGHV)CR
HOEJCT9KFVJ
VQRKPUVQR
VQR)CR
HOIGV#UEGPV
DQVVQOKPUDQVVQO
DQVVQO)CR
HOIGV#UEGPV
TKIJVKPUTKIJV
TKIJV)CR
,GħNKYCTVQħèOKPKOCNPCLGUVFQFCVPKCWľ[L
LCMQOKGLUECRQEæVMQYGIQ
LGħNKYCTVQħèOCMU[OCNPCLGUVWLGOPCWľ[L
KH
OKP OKP
KH
OCZOCZ
1DNKEQFNGIđQħèOKúF[OKPKOWOKOCMUKOWO
URTGCF
KPV
OCZOKP
1DNKEYURÎđE[PPKMUMCNQYCPKC
UECNG
FQWDNG
YKP5KGJGKIJVDQVVQOVQRURTGCF
2QPCLRQđQľGPKGRQFUVCY[
DCUGNKPG
KPV
YKP5KGJGKIJVDQVVQO
OKPUECNG
1DNKEQFNGIđQħèOKúF[FCP[OK
J)CR
YKP5KGYKFVJNGHVTKIJV
FCVCNGPIVJ
7UVCYMQNQTUKCVMK
IUGV QNQT
ITKF QNQT
0CT[UWLYURÎđTúFPG
IFTCY.KPG
NGHVDCUGNKPG
NGHV
FCVCNGPIVJJ)CRDCUGNKPG
0CT[UWLQħ;
KH
ITCRJ5V[NG$#4
IFTCY.KPG
NGHVYKP5KGJGKIJVDQVVQONGHVVQR
9[ħYKGVNYCTVQħEKOKPOCZK
IFTCY5VTKPI
KPUNGHVDCUGNKPG
HOIGV#UEGPV
F
KH
OCZ
IFTCY5VTKPI
OCZKPUNGHVDCUGNKPG
KPV
OCZUECNG
KH
OKP
IFTCY5VTKPI
OKPKPUNGHVDCUGNKPG
KPV
OKPUECNG
HOIGV#UEGPV
230
Java. Sztuka programowania
9[ħYKGVNYCTVQħEK
IFTCY5VTKPI
FCVCNGPIVJ
FCVCNGPIVJ
J)CR
NGHV
DCUGNKPG
HOIGV#UEGPV
7UVCYMQNQTFCP[EJ
IUGV QNQT
FCVC QNQT
9[ħYKGVNFCPG
UYKVEJ
ITCRJ5V[NG]
ECUG$#4
DCTITCRJ
I
DTGCM
ECUG5 #66 4
UECVVGT
I
DTGCM
ECUG4 )2.16
TGIRNQV
I
DTGCM
_
_
9[ħYKGVNCPKGY[MTGUWUđWRMQYGIQ
RTKXCVGXQKFDCTITCRJ
)TCRJKEUI]
KPVX
HQT
KPVKKFCVCNGPIVJK
]
X
KPV
FCVC=K?UECNG
IFTCY.KPG
KJ)CR
NGHVDCUGNKPG
KJ)CR
NGHVDCUGNKPGX
_
_
9[ħYKGVNCPKGY[MTGUWRWPMVQYGIQ
RTKXCVGXQKFUECVVGT
)TCRJKEUI]
KPVX
HQT
KPVKKFCVCNGPIVJK
]
X
KPV
FCVC=K?UECNG
IFTCY4GEV
KJ)CR
NGHVDCUGNKPGX
_
_
9[MTGURWPMVQY[NKPKæTGITGULK
RTKXCVGXQKFTGIRNQV
)TCRJKEUI]
KPVX
4GI CVCTF5VCVUTGITGUU
FCVC
HQT
KPVKKFCVCNGPIVJK
]
X
KPV
FCVC=K?UECNG
IFTCY4GEV
KJ)CR
NGHVDCUGNKPGX
_
Rozdział 8. ♦ Statystyka i wykresy
231
4[UQYCPKGNKPKKTGITGULK
IFTCY.KPG
NGHVDCUGNKPG
KPV
TFCUECNG
J)CR
FCVCNGPIVJ
NGHV
DCUGNKPG
KPV
TFC
TFD
FCVCNGPIVJUECNG
_
_
Zmienne klasy Graphs
Klasa )TCRJU zaczyna się od zdefiniowania następujących zmiennycih.
5VCđGTQFCLÎYY[MTGUÎY
RWDNKEHKPCNUVCVKEKPV$#4
RWDNKEHKPCNUVCVKEKPV5 #66 4
RWDNKEHKPCNUVCVKEKPV4 )2.16
RTKXCVGKPVITCRJ5V[NG
Pierwsze trzy zmienne typu HKPCNUVCVKE noszą nazwy $#4, 5 #66 4 i 4 )2.16. War-
tości te oznaczają różne typy wykresów. Typ wykresu jest przechowywany w zmiennej
ITCRJ5V[NG.
Następnie definiuje się zmienne przechowujące wielkość odstępu między granicą
okna a początkiem obszaru wyświetlania danych na wyikresie.
1MTGħNCKNQħèOKGLUECFQRQQUVCYKGPKC
OKúF[QDUCTGOFCP[EJCMTCYúFKæ
RTKXCVGHKPCNKPVNGHV)CR
RTKXCVGHKPCNKPVVQR)CR
RTKXCVGHKPCNKPVDQVVQO)CR
RTKXCVGKPVTKIJV)CRQDNKECPKGVGLYCTVQħEK
Wszystkie zmienne poza TKIJV)CR są typu HKPCN. Zmienna TKIJV)CR jest obliczana póź-
niej, gdyż zależy ona od aktualnej szerokości znaków oraz liczby wyświetlanych danych.
Następnie deklarowane są następujące zmienne.
2TGEJQYWLGYCTVQħèOKPKOCNPæKOCMU[OCNPæFCP[EJ
RTKXCVGFQWDNGOKPOCZ
1FPKGUKGPKGUKúFQFCP[EJ
RTKXCVGFQWDNG=?FCVC
Zmienne OKP i OCZ przechowują minimalną i maksymalną wartość danych. Tablica
przechowująca dane jest dostępna przez referencję FCVC.
Kolory używane przez wykres znajdują się w zmiennych iITKF QNQT i FCVC QNQT.
-QNQT[Y[MTGUW
QNQTITKF QNQTPGY QNQT
QNQTFCVC QNQTPGY QNQT
Linie siatki są jasnozielone, natomiast dane są zaznaczane na czarno. Oczywiście można
zmienić te kolory na dowolne inne.
232
Java. Sztuka programowania
Następnie deklaruje się różne zmienne związane ze skialowaniem.
4ÎľPGYCTVQħEKWľ[YCPGFQUMCNQYCPKCKY[ħYKGVNCPKCFFCP[EJ
RTKXCVGKPVJ)CRQFUVúROKúF[RWPMVCOKFCP[EJ
RTKXCVGKPVURTGCFQFUVúROKúF[YCTVQħEKCOKOKPKFOCZ
RTKXCVGFQWDNGUECNGYURÎđE[PPKMUMCNQYCPKC
RTKXCVGKPVDCUGNKPGRKQPQY[YURÎđE[PPKMRQFUVCY[F
Odległość między punktami danych na osi X zawiera zmienna J)CR. Liczbę jednostek
między wartością minimalną a maksymalną przechowuje zmienna URTGCF. Współczyn-
nik skali znajduje się w zmiennej UECNG. Pionowe położenie linii bazy (czyli osi X)
znajduje się w zmiennej DCUGNKPG.
Na końcu zadeklarowano obszary VQR, DQVVQO, NGHV i TKIJV.
.QMCNKCELCQDUCTWFCP[EJYQMPKG
RTKXCVGKPVVQRDQVVQONGHVTKIJV
Zmienne te definiują obszar danych wewnątrz okna.
Konstruktor klasy Graphs
Konstruktor przyjmuje dwa argumenty. Pierwszy to referencja do danych, które mają
zostać wyświetlone. Drugim jest rodzaj wykresu. Przekazaną wartością musi być
)TCRJ$#4, )TCRJ5 #66 4 lub )TCRJ4 )2.16.
W konstruktorze najpierw należy przypisać nasłuchiwaniie zdarzenia zamykania okna.
1DUđWICFCTGēCOMPKúEKCQMPC
CFF9KPFQY.KUVGPGT
PGY9KPFQY#FCRVGT
]
RWDNKEXQKFYKPFQY NQUKPI
9KPFQY XGPVYG]
UGV8KUKDNG
HCNUG
FKURQUG
_
_
Nasłuchiwanie dodaje się przez wywołanie metody CFF9KPFQY.KUVGPGT
i przekaza-
nie obiektu 9KPFQY#FCRVGT, w którym przysłonięto metodę YKPFQY NQUKPI
. Warto
przypomnieć, iż klasa adapterowa zawiera puste implementacje wszystkich metod
wymaganych przez dany interfejs. W tym przypadku adapter 9KPFQY#FCRVGT imple-
mentuje interfejs 9KPFQY.KUVGPGT. Adapter zapewnia puste implementacje wszystkich
wymaganych metod, zatem trzeba tylko przysłonić odpowiednią metodę, w tym przy-
padku YKPFQY NQUKPI
.
W przypadku zamykania okna należy je ukryć wywołując polecenie UGV8KUKDNG
HCNUG.
Następnie usuwa się okno z systemu poleceniem FKURQUG
. Metody te są zdefinio-
wane dla okien (TCOG z AWT.
Następnie należy dodać nasłuchiwanie zdarzeń zmiany rozmiaru okna. Wywołuje się
metodę CFF QORQPGPV
Pobierz darmowy fragment (pdf)