Java. Sztuka programowania

42
Wydawnictwo Helion ul. Chopina 6 44-100 Gliwice tel. (32)230-98-63 e-mail: [email protected] PRZYK£ADOWY ROZDZIA£ PRZYK£ADOWY ROZDZIA£ IDZ DO IDZ DO ZAMÓW DRUKOWANY KATALOG ZAMÓW DRUKOWANY KATALOG KATALOG KSI¥¯EK KATALOG KSI¥¯EK TWÓJ KOSZYK TWÓJ KOSZYK CENNIK I INFORMACJE CENNIK I INFORMACJE ZAMÓW INFORMACJE O NOWOCIACH ZAMÓW INFORMACJE O NOWOCIACH ZAMÓW CENNIK ZAMÓW CENNI K CZYTELNIA CZYTELNIA FRAGMENTY KSI¥¯EK ONLINE FRAGMENTY KSI¥¯EK ONLINE SPIS TRECI SPIS TRECI DODAJ DO KOSZYKA DODAJ DO KOSZYKA KATALOG ONLINE KATALOG ONLINE 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¿liwoci¹ 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. • Przeledzenie ró¿nych technik wyszukiwania bazuj¹cych na sztucznej inteligencji, • Zapoznanie siê z mo¿liwoci¹ 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.

description

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 autorytetem w sprawach języków C, C++, Java i C#, a także doskonałym programistą systemu Windows. [więcej...]James Holmes jest konsultantem do spraw tworzenia programowania oraz aplikacji serwerowych w środowiskach biznesowych. [więcej...] Jeżeli poznałeś już podstawy Javy, to czas na następny krok.* Uwolnij siłę drzemiącą w Javie i w jej bibliotekach.* Niezwykle różnorodne przykłady praktycznych aplikacji.* Cenny kod źródłowy do wykorzystania we własnych projektach.

Transcript of Java. Sztuka programowania

Wydawnictwo Helion

ul. Chopina 6

44-100 Gliwice

tel. (32)230-98-63

e-mail: [email protected]

PRZYK£ADOWY ROZDZIA£PRZYK£ADOWY ROZDZIA£

IDZ DOIDZ DO

ZAMÓW DRUKOWANY KATALOGZAMÓW DRUKOWANY KATALOG

KATALOG KSI¥¯EKKATALOG KSI¥¯EK

TWÓJ KOSZYKTWÓJ KOSZYK

CENNIK I INFORMACJECENNIK I INFORMACJE

ZAMÓW INFORMACJEO NOWO�CIACH

ZAMÓW INFORMACJEO NOWO�CIACH

ZAMÓW CENNIKZAMÓW CENNIK

CZYTELNIACZYTELNIA

FRAGMENTY KSI¥¯EK ONLINEFRAGMENTY KSI¥¯EK ONLINE

SPIS TRE�CISPIS TRE�CI

DODAJ DO KOSZYKADODAJ DO KOSZYKA

KATALOG ONLINEKATALOG ONLINE

Java. SztukaprogramowaniaAutorzy: 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 ........................................................................................ 7

Przedmowa........................................................................................ 9

Rozdział 1. Geniusz Javy.................................................................................... 13Typy proste i obiekty — odpowiednia równowaga ..........................................................14Zarządzanie pamięcią przez usuwanie niepotrzebnych obiektów.....................................15Elegancki i prosty model wielowątkowy ..........................................................................16W pełni zintegrowane wyjątki...........................................................................................16Zaakcentowanie znaczenia polimorfizmu.........................................................................17Przenośność i bezpieczeństwo dzięki kodowi bajtowemu................................................18Bogactwo interfejsów programistycznych Javy................................................................18Aplet ..................................................................................................................................19Ciągła rewolucja................................................................................................................20

Rozdział 2. Rekurencyjny analizator wyrażeń ...................................................... 21Wyrażenia..........................................................................................................................22Analiza wyrażeń — problem.............................................................................................22Przetwarzanie wyrażenia...................................................................................................23Rozbijanie wyrażenia ........................................................................................................25Prosty analizator wyrażeń .................................................................................................28

Opis działania analizatora ...........................................................................................34Dodawanie zmiennych do analizatora...............................................................................35Sprawdzanie składni w analizatorze rekurencyjnym ........................................................43Aplet kalkulatora ...............................................................................................................44Możliwe modyfikacje........................................................................................................46

Rozdział 3. Implementacja interpreterów języków w Javie................................... 47Jaki język programowana interpretować? .........................................................................48Wstęp do interpretera ........................................................................................................49Interpreter języka SBASIC................................................................................................50Analizator wyrażeń języka SBASIC.................................................................................67

Wyrażenia w SBASIC ................................................................................................67Tokeny SBASIC .........................................................................................................68

Interpreter ..........................................................................................................................72Klasa InterpreterException .........................................................................................72Konstruktor klasy SBasic............................................................................................72Słowa kluczowe ..........................................................................................................74Metoda run() ...............................................................................................................75Metoda sbInterp()........................................................................................................76Przypisanie..................................................................................................................77

4 Java. Sztuka programowania

Instrukcja PRINT........................................................................................................78Instrukcja INPUT........................................................................................................79Instrukcja GOTO ........................................................................................................80Instrukcja IF ................................................................................................................83Pętla FOR....................................................................................................................83Instrukcja GOSUB......................................................................................................86Instrukcja END ...........................................................................................................87

Wykorzystanie języka SBASIC ........................................................................................87Inne przykładowe programy języka SBASIC.............................................................88

Rozszerzanie interpretera ..................................................................................................90Tworzenie własnego języka programowania ....................................................................90

Rozdział 4. Wykonanie menedżera pobierania plików w Javie .............................. 91Sposoby pobierania plików z internetu .............................................................................92Omówienie programu........................................................................................................92Klasa Download ................................................................................................................93

Zmienne pobierania ....................................................................................................97Konstruktor klasy........................................................................................................97Metoda download() .....................................................................................................97Metoda run() ...............................................................................................................97Metoda stateChanged() .............................................................................................101Metody akcesorowe i działań....................................................................................101

Klasa ProgressRenderer ..................................................................................................101Klasa DownloadsTableModel .........................................................................................102

Metoda addDownload() ............................................................................................104Metoda clearDownload() ..........................................................................................105Metoda getColumnClass() ........................................................................................105Metoda getValueAt() ................................................................................................105Metoda update() ........................................................................................................106

Klasa DownloadManager................................................................................................106Zmienne klasy DownloadManager ...........................................................................111Konstruktor klasy......................................................................................................112Metoda verifyUrl()....................................................................................................112Metoda tableSelectionChanged()..............................................................................113Metoda updateButtons()............................................................................................113Obsługa zdarzeń akcji ...............................................................................................114

Kompilacja i uruchamianie programu.............................................................................115Rozszerzanie możliwości programu................................................................................115

Rozdział 5. Implementacja klienta e-mail w Javie ............................................. 117Poczta elektroniczna od podszewki.................................................................................118

POP3 .........................................................................................................................118IMAP.........................................................................................................................118SMTP ........................................................................................................................118Ogólna procedura wysyłania lub odbierania wiadomości e-mail .............................119

Interfejs programistyczny JavaMail ................................................................................119Ogólny opis wykorzystania biblioteki ......................................................................120

Prosty klient poczty elektronicznej .................................................................................121Klasa ConnectDialog ................................................................................................122Klasa DownloadingDialog........................................................................................127Klasa MessageDialog................................................................................................128Klasa MessageTableModel .......................................................................................134Klasa EmailClient .....................................................................................................138

Kompilacja i uruchamianie klienta poczty......................................................................153Rozszerzanie możliwości klienta ....................................................................................154

Spis treści 5

Rozdział 6. Przeszukiwanie sieci za pomocą Javy.............................................. 155Podstawy funkcjonowania agenta internetowego ...........................................................156Omówienie protokołu robot ............................................................................................157Wprowadzenie do agenta wyszukiwania ........................................................................158Klasa SearchCrawler .......................................................................................................158

Zmienne klasy...........................................................................................................173Konstruktor klasy SearchCrawler .............................................................................173Metoda actionSearch() ..............................................................................................174Metoda search() ........................................................................................................176Metoda showError()..................................................................................................179Metoda updateStats() ................................................................................................179Metoda addMatch()...................................................................................................180Metoda verifyUrl()....................................................................................................180Metoda isRobotAllowed() ........................................................................................181Metoda downloadPage() ...........................................................................................183Metoda removeWwwFromUrl() ...............................................................................184Metoda retrieveLinks() .............................................................................................185Metoda searchStringMatches() .................................................................................191Metoda crawl()..........................................................................................................192

Kompilacja i uruchomienie programu.............................................................................194Możliwe zastosowania agentów internetowych..............................................................196

Rozdział 7. Rendering HTML w Javie ................................................................ 197Rendering HTML w edytorze JEditorPane.....................................................................197Obsługa zdarzeń łączy.....................................................................................................198Tworzenie prostej przeglądarki internetowej..................................................................199

Klasa MiniBrowser ...................................................................................................199Zmienne klasy MiniBrowser.....................................................................................204Konstruktor klasy......................................................................................................205Metoda actionBack().................................................................................................205Metoda actionForward() ...........................................................................................206Metoda actionGo() ....................................................................................................206Metoda showError()..................................................................................................207Metoda verifyUrl()....................................................................................................207Metoda showPage() ..................................................................................................207Metoda updateButtons()............................................................................................209Metoda hyperlinkUpdate()........................................................................................210

Kompilacja i uruchomienie przeglądarki ........................................................................210Zastosowania renderingu HTML ....................................................................................211

Rozdział 8. Statystyka i wykresy ..................................................................... 213Próbki, zbiory, rozkład i zmienne ...................................................................................214Podstawy statystyki .........................................................................................................215

Średnia ......................................................................................................................215Mediana.....................................................................................................................216Moda (dominanta).....................................................................................................216

Wariancje i odchylenie standardowe...............................................................................218Równanie regresji............................................................................................................219

Współczynnik korelacji ............................................................................................221Cała klasa Stats................................................................................................................223Tworzenie wykresów ......................................................................................................226

Skalowanie danych ...................................................................................................226Klasa Graphs.............................................................................................................227Zmienne klasy Graphs ..............................................................................................231Konstruktor klasy Graphs .........................................................................................232Metoda paint()...........................................................................................................234

6 Java. Sztuka programowania

Metoda bargraph() ....................................................................................................237Metoda scatter() ........................................................................................................237Metoda regplot() .......................................................................................................237

Aplikacja tworzenia statystyk .........................................................................................238Konstruktor klasy StatsWin ......................................................................................242Procedura obsługi itemStateChanged().....................................................................243Metoda actionPerformed() ........................................................................................244Metoda shutdown() ...................................................................................................244Metoda createMenu()................................................................................................244Klasa DataWin ..........................................................................................................244Łączymy wszystko razem.........................................................................................245

Prosty aplet ze statystykami ............................................................................................247Możliwe udoskonalenia...................................................................................................249

Rozdział 9. Aplety i serwlety finansowe............................................................ 251Znajdowanie raty kredytu................................................................................................252

Pola apletu.................................................................................................................255Metoda init() .............................................................................................................256Metoda actionPerformed() ........................................................................................258Metoda paint()...........................................................................................................258Metoda compute() .....................................................................................................259

Znajdowanie przyszłej wartości inwestycji.....................................................................260Znajdowanie wkładu początkowego wymaganegodo uzyskania przyszłej wartości inwestycji ..................................................................263

Znalezienie inwestycji początkowej wymaganej do uzyskania odpowiedniej emerytury ......267Znajdowanie maksymalnej emerytury dla danej inwestycji ...........................................271Obliczenie pozostałej kwoty do spłaty kredytu...............................................................275Tworzenie serwletów finansowych.................................................................................278

Serwer Tomcat ..........................................................................................................278Konwersja apletu RegPay do serwletu .....................................................................280Serwlet RegPayS.......................................................................................................280

Możliwe rozszerzenia......................................................................................................283

Rozdział 10. Rozwiązywanie problemów za pomocą sztucznej inteligencji ............ 285Reprezentacja i terminologia...........................................................................................286Rosnąca liczba kombinacji..............................................................................................287Techniki wyszukiwania...................................................................................................288

Obliczanie wyszukiwania .........................................................................................289Problem ...........................................................................................................................289

Reprezentacja graficzna ............................................................................................290Klasa FlightInfo...............................................................................................................291Wyszukiwanie w głąb .....................................................................................................291

Analiza wyszukiwania w głąb ..................................................................................300Wyszukiwanie wszerz .....................................................................................................300

Analiza wyszukiwania wszerz ..................................................................................302Dodanie heurystyki .........................................................................................................303

Wyszukiwanie wspinaczkowe ..................................................................................304Analiza wyszukiwania wspinaczkowego..................................................................308Wyszukiwanie najmniejszego kosztu .......................................................................309Analiza wyszukiwania najmniejszego kosztu...........................................................310

Znajdowanie wielu rozwiązań.........................................................................................311Usuwanie ścieżek......................................................................................................311Usuwanie węzłów .....................................................................................................312

Znalezienie „optymalnego” rozwiązania ........................................................................317Powrót do zagubionych kluczy .......................................................................................321

Skorowidz...................................................................................... 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ówi 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 kilkumiesięcy i rysować wykres prezentujący zmiany ceny. Statystyka i wykresy bardzoczęsto pojawiają się w trakcie pisania programów w Javie, zatem zajmiemy się nimiw 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. Javanie jest zoptymalizowana pod kątem obliczeń matematycznych ale wspiera różnemetody obliczeń. Choć obliczenia pokazane w tym rozdziale nie wymagają dużejmocy 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. Javaposiada aktualnie dwa systemy graficznych interfejsów użytkownika: AWT i Swing.System Swing był dosyć intensywnie opisywany w poprzednich rozdziałach, zatemteraz warto zapoznać się z systemem AWT. Czytelnik dowie się, w jaki sposób możnatworzyć 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ętrznei adaptory, zatem kod interfejsu graficznego w tym języku jest bardziej elegancki i krót-szy od tego samego kodu uzyskiwanego w innych językach.

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 danejsytuacji. 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 tylkow jednym dniu. W ten sposób można dokonać ekstrapolacji dotyczącej całego roku napodstawie 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łegoroku, 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żliwychjest kilka różnych rodzajów rozkładów prawdopodobieństwa przyjmowania wartościprzez zmienne losowe. Najbardziej znanym jest rozkład normalny, czyli rozkład Gaussa,którego reprezentacją jest tzw. krzywa dzwonowa. Rozkład analizowanych wartościprzyjmuje kształt symetrycznego dzwonu. Oznacza to, że zmienne losowe o wartościzbliżonej do przeciętnej występują najczęściej.

W trakcie badania statystycznego określa się zmienne zależne (badane) i zmienneniezależ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 jestuż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 ������.Wszystkie metody statystyczne są metodami typu ���� przechowywanymi w klasie����. Klasę tą w całości przedstawimy w dalszej części rozdziału. Prezentowane metodysą typu ����, zatem można je wywołać bez potrzeby tworzenia obiektu ����.

Średnia

Średnia jest najczęściej wykorzystywaną funkcją w statystyce. Zapewnia obliczaniewartości średniej arytmetycznej podanego zbioru zmiennych losowych. W ten sposóbznajduje 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 sumą 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 douzyskania wyniku 5.5. Wzór na średnią arytmetyczną jest 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 ���� oblicza średnią dla wartości przekazanych w tablicyjako parametr. Metoda zwraca średnią arytmetyczną.

�������������� ������������������������������������������������������������������ �!�!"

��#�������� !"���$�����������"��%%���������% ��������"

������� �����������"

�����������"&

Aby użyć metody ����, wystarczy tylko przekazać referencję do tablicy zawierającejzbiór wartości. Jako wynik wykonania metody otrzymuje się wartość średniej arytme-tycznej elementów przekazanej tablicy.

216 Java. Sztuka programowania

Mediana

Mediana próbki jest określana jako wartość środkowa dla uporządkowanego rosnącocią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 przykł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ścimediany i średniej są podobne. Im jednak rozkład próbki będzie bardziej odbiegał odrozkładu normalnego, tym różnica między medianą a średnią 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 metody �����.

��������������'��������������������������������������������������������������������� ��������������������"

��(�������������������)�!)����)�!)������������"

��*���������������"�������������������

��������+����������������,��-����#�������������./ !����������0���������1��������1�����������)�1��-2����� �������������������������/��%���������������������������/�34����/"��&���������������������������/�"&

Aby użyć metody �����, wystarczy tylko przekazać referencję do tablicy zawie-rającej zbiór wartości. Jako wynik wykonania metody otrzymuje się wartość mediany.

Warto zauważyć, iż prezentowana metoda wykonuje kopię przekazanej tablicy zapomocą polecenia ����� ����������. Sortowaniu podlega właśnie kopia. W tensposób przekazana tablica nie ulega modyfikacji. Zachowanie oryginalnej kolejnościjest bardzo ważne, na przykład w przypadku tworzenia wykresu.

Moda (dominanta)

Moda próbki jest wartością najczęściej występującą w zbiorze. 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 zbioremunimodalnym. 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, próbka nie posiada mody.

Poniższa metoda ����� znajduje modę zbioru.

�5����������'���������'�������������������������6�- �,�7�8�9:�������-���1�;��1�������)������<����1����1���������'��-��1'���-�����1����;�������=�����������'�-������������-�������'��+�����1'���)���1��������-������,�������1��1�������5����������������������������������������������7�8�9:���������������)���>��� �!�!"�����������)��������� �!"

��#�������� !"���$�����������"��%%��������� ��������"���������� �!"

�����������1��������'�����������1�1�+�������������������#�������- �%4"�-�$�����������"�-%%��������#��� ������-��������%%"

�����5�0�������������?�����'��-��1'���-���<�����1���������1�����'��-�- ��5������#�������@�������������������>��� ��"�������������� ������"����&��&

���#��������� �!��������������7�8�9:��������"����������������>��"&

Metoda ����� zlicza najpierw liczbę wystąpień poszczególnych wartości w tablicy���. Jeżeli znajdzie wartość występującą więcej razy niż poprzednia, zapamiętujenową wartość w �����. Po zakończeniu procesu najczęściej występująca wartośćznajduje się w zmiennej ����� i jest ona zwracana. W przypadku wstępowania wieluwartości mody, metoda zwraca tylko pierwszą. Jeżeli próbka nie zawiera dominanty,następuje zgłoszenie wyjątku ��������������. Oto postać klasy ��������������.

���6�- �,�1�;��1������11�8���������7�8�9:�������:����9:�����������������(��������(�������������������A���+�����1����������A"��&&

218 Java. Sztuka programowania

Wariancje i odchylenie standardowe

Choć podsumowanie zbioru zmiennych losowych jedną wartością, taką jak średnia lubmediana wydaje się być bardzo przekonujące, takie podejście nie zapewnia możliwościwykonania 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 mediananie reprezentuje jej w wystarczający sposób. Oto przykład

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 zinterpretować ś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 standardowejest ważniejsze, gdyż wyznacza średnią odległość pomiędzy wartościami zmiennychlosowych 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ściposzczególnych zmiennych losowych w próbie. Konieczne jest podnoszenie wynikudo kwadratu, aby uzyskiwać tylko wartości dodatnie. Jeżeli wzór nie uwzględniałbypodnoszenia do kwadratu, wynik często wynosiłby zero.

Odchylenie standardowe znajduje się obliczając pierwiastek kwadratowy wariancji.Z tego powodu wzór na odchylenie standardowe ma następującą postać.

Jak już wspomniano wcześniej, odchylenie standardowe jest bardziej przydatne odwariancji. 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ólnychwartości zmiennych od ich wartości średniej (zobacz tabelę na następnej stronie).

Z powyższej tabeli wynika, iż średnia kwadratów różnic wartości zmiennych losowychod 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 średniejwartości wszystkich elementów.

Rozdział 8. ♦ Statystyka i wykresy 219

Di Di–M (Di–M)2

11 –29 841

20 –20 400

40 0 0

30 –10 100

99 59 3481

30 –10 100

50 10 100

Suma: 5022

Średnia sumy: 717.43

Odchylenie standardowe informuje o tym, czy wartość średniej dla elementów dobrzereprezentuje zbiór. Jeśli na przykład kupiono fabrykę batoników a kierownik informujeo tym, iż w poprzednim miesiącu wyprodukowano średnio 2 500 batoników dziennieale odchylenie standardowe wyniosło 2 000, należy się zastanowić nad poprawą liniiprodukcyjnej.

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 standardowymod średniej a koło 95% znajdzie się w podwójnym odchyleniu standardowym.

Przedstawiona poniżej metoda �������� oblicza odchylenie standardowe dla tablicywartości.

���������������������������1������������������������������������B�������������������������� �!�!"����������� ����������"

��#�������� !"���$�����������"��%%��������% ���������3�����5���������3����"

������ �����������"����� �8�����C������"

����������"&

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ównanieto opisuje związek dwóch wartości, które wchodzą w skład dwuwymiarowej zmiennejlosowej. Często linię tę nazywa się linią najmniejszych kwadratów.

220 Java. Sztuka programowania

Przed zaprezentowaniem odpowiedniego wzoru warto przypomnieć, iż linia prostaw 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żenielinii w układzie współrzędnych, trzeba odnaleźć wartoś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ówodchyleń między poszczególnymi danymi a linią. Znalezienie tego równania wymagadwó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 Cena

0 68

1 75

2 74

3 80

4 81

5 85

6 82

7 87

8 91

9 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. Wartotakże zauważyć, iż punkty reprezentujące zmienne losowe (dane) są położone bardzoblisko linii regresji. Analizując przebieg linii można przewidzieć, iż w roku 11 cenaakcji 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 tylkoprzewidywanie. 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 liniaregresji 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, maon dużą wartość.

Aby określić znaczenie otrzymanej linii regresji, najczęściej oblicza się współczynnikkorelacji, 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 jestto 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ązkumiędzy linią a danymi (w takim przypadku każda dowolna linia prosta byłaby równiedobra 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ązekzmiennej zależnej od zmiennej niezależnej. Dla ujemnego współczynnika występujezwiązek odwrotny.

Wzór służący do obliczania współczynnika korelacji jest następujący.

222 Java. Sztuka programowania

We wzorze Mx oznacza średnią współrzędnej X, My — średnią współrzędnej Y. Znakwspółczynnika zależy od nachylenia linii regresji. Ogólnie wartość wynosząca 0,81lub więcej jest traktowana jako silny związek. Oznacza to, iż około 66% danych jestdopasowanych do linii regresji. Aby zamienić współczynnik na wartość procentową,wystarczy podnieść go do kwadratu i pomnożyć przez 100. Uzyskana w ten sposóbwartość jest nazywana współczynnikiem determinacji.

Metoda ��������� przedstawiona poniżej oblicza równanie regresji oraz współczyn-nik korelacji.

�5�D����1��������-�������+;�1����,�,�����-��������������1����������������6�����������1���- ������+;�1'� �E��6��+;�1'� �F�-����1��������,������-����-����,�<���,��,����5���������������G�B��������������������������������)��)��*��)�:*��)����)����/)����"�����������/��� ��������������������"

�����H����1���#����������1������1��������#����������1���,����7����I�������#� �7����I��������J��������"���#���8�:����I�������B������/�"

���������1��������-����������E����*��� ����������"

���������1��������-�,���������F���:*��� �!�!"��#�������� !"���$�����������"��%%��:*���% ��"��:*���� �����������"

���������1������������ ����/� �!�!"��#�������� !"���$�����������"��%%�����������% ���������3�*����5���3:*���"�������/�% ���3:*����5���3:*���"��&

���� ��������/"

���������1���������� ��*���3���5:*���"

�����D����1������+;�1����,+��,�����-����#�������� !"���$�����������"��%%������/���� ��%4"������ ���������������"������� ���B��������5���B������/�"

�����������G�B�����)��)����)�AE� �A�%����������������������#�#���������%��A�%�A�%����������������������#�#���������%�A�5�FA�"&

Należy podkreślić, iż metoda opiera się na założeniu, że zmienną niezależną (X) jestczas. Z tego powodu w każdym kroku zwiększa wartość tej zmiennej o 1. Średniawartości X jest obliczana następującymi poleceniami.

Rozdział 8. ♦ Statystyka i wykresy 223

�������1��������-�,���������F�:*��� �!�!"#�������� !"���$�����������"��%%��:*���% ��":*���� �����������"

Wartości od 0 do liczby elementów są ze sobą sumowane a następnie wynik tej operacjijest dzielony przez liczbę elementów. W ten sposób powstaje ś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 rozpatrywany w niniejszym rozdziale.

Metoda ��������� zwraca wartości a i b, tekstową reprezentację równania regresjii współczynnik korelacji, wszystkie dane zostają umieszczone w obiekcie �����.Klasę tego obiektu przedstawiono poniżej.

���K��,�������1�����-���������1�������-�-�������G�B��������������������)��"�����������������"���������(������C������"

���������G�B����������)������-)������,)�(������������������ ��"������ �-"�������� �,"����C������� ����"��&&

Cała klasa Stats

Wszystkie metody statystyczne znajdują się w jednej klasie ����, której kod przed-stawiono poniżej. W tym samym pliku źródłowym umieszczono także klasy �����i ��������������.

�������-���������5"�������-�����:��5"

���K��,�������1�����-���������1�������-�-�������G�B��������������������)��"�����������������"���������(������C������"

���������G�B����������)������-)������,)�(������������������ ��"������ �-"�������� �,"����C������� ����"��&&

224 Java. Sztuka programowania

���6�- �,�1�;��1������11�8���������7�8�9:�������:����9:�����������������(��������(�������������������A���+�����1����������A"��&&

���D�+����,�������������,��������������(���������������������� ���������������������������������������������������������������������� �!�!"

����#�������� !"���$�����������"��%%�����������% ��������"

��������� �����������"

�������������"��&

����������������'������������������������������������������������������������������������� ��������������������"

����(�������������������)�!)����)�!)������������"

����*���������������"�������������������

����������+����������������,��-������#�������������./ !������������0���������1��������1�����������)�1��-2����� ���������������������������/��%�����������������������������/�34����/"����&�����������������������������/�"��&

���5����������'���������'���������������������������6�- �,�7�8�9:�������-���1�;��1�������)��������<����1����1���������'��-��1'���-�����1����;���������=�����������'�-������������-�������'��+�����1'���)�����1��������-������,�������1��1�������5��������������������������������������������������7�8�9:�������������������)���>��� �!�!"�������������)��������� �!"

����#�������� !"���$�����������"��%%����������� ��������"������������ �!"

�������������1��������'����L����1�1�+���������������������#�������- �%4"�-�$�����������"�-%%����������#��� ������-��������%%"

Rozdział 8. ♦ Statystyka i wykresy 225

�������5�0�������������?�����'��-��1'���-���<�����1�����������1�����'��-�- ��5��������#�������@���������������������>��� ��"���������������� ������"������&����&

�����#��������� �!����������������7�8�9:��������"��������������������>��"��&

�����������������������������1��������������������������������������B���������������������������� �!�!"������������� ����������"

����#�������� !"���$�����������"��%%����������% ���������3�����5���������3����"

�������� �����������"������� �8�����C������"

������������"��&

���5�D����1��������-�������+;�1����,��,�����-����������������1����������������6�����������1���- ��������+;�1'� �E��6��+;�1'� �F�-����1����������,������-����-����,�<���,��,����5�����������������G�B����������������������������������)��)��*��)�:*��)����)����/)����"�������������/��� ��������������������"

�������H����1���#����������1������1��������#����������1���,������7����I�������#� �7����I��������J��������"�����#���8�:����I�������B������/�"

�����������1��������-����������E������*��� ����������"

�����������1��������-�,���������F�����:*��� �!�!"����#�������� !"���$�����������"��%%��:*���% ��"����:*���� �����������"

�����������1�������������� ����/� �!�!"����#�������� !"���$�����������"��%%�������������% ���������3�*����5���3:*���"���������/�% ���3:*����5���3:*���"����&

������ ��������/"

226 Java. Sztuka programowania

�����������1������������ ��*���3���5:*���"

�������D����1������+;�1����,+��,�����-������#�������� !"���$�����������"��%%������/���� ��%4"�������� ���������������"��������� ���B��������5���B������/�"

�������������G�B�����)��)����)�AE� �A�%������������������������#�#���������%��A�%�A�%������������������������#�#���������%�A�5�FA�"��&&

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órenie zawsze są oczywiste po przeanalizowaniu statystyk. Poza tym wykres dokładnieobrazuje 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 zapomocą 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óżnychmetod 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 okna.

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 wykrespunktowy z linią regresji. Jak będzie się można przekonać, większość kodu, na przy-kład ten zapewniający skalowanie, jest taka sama dla wszystkich wykresów.

Skalowanie danych

Aby metoda rysowania mogła obsługiwać dowolne jednostki wielkości, potrzebne jestodpowiednie skalowanie danych. Skalowanie musi być powiązane z aktualnym roz-miarem okna. Co więcej, skalowanie musi się odbywać dynamicznie. Każda zmianarozmiaru okna powinna powodować dostosowanie skali.

Proces skalowania wymaga znalezienia stosunku między zakresem danych a fizycznymiwymiarami 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ędnychwewnątrz okna. Oto przykład wzoru na skalowanie dla osi Y.

Y' = Y * (szerokość_okna / (max – min))

gdzie Y' jest skalowaną wartością, opisująca położenie 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żdymrazem, gdy następuje ponowne rysowanie wykresu, gdyż szerokość ta mogła uleczmianie. Co więcej, od łącznej szerokości okna trzeba odjąć szerokość obramowaniaokna. 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żone.

Klasa Graphs

Metody rysowania wykresów znajdują się w klasie �����. Klasa ta rozszerza klasę � �. Z tego powodu wykresy znajdują się wewnątrz głównych okien. Czyni to wykresyniezależ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 �����. Klasę tę dokładniej opisano w dalszejczęści rozdziału.

�������-��������5"�������-������������5"�������-����������5"�������-���������5"

���D�+����,�����������������,��+���������������=������:����I����������(��;���1�-+����,��+�����������#����������������M*G� �!"���������#����������������(N*KK9G� �4"���������#����������������G9=OPDK� �/"

������������������(���"

���5�D,���������?���-��������1����������������'1�����1������������,���'1� ��5����������#����������#�=��� �/"���������#������������=��� �/"���������#���������������=��� �/"������������������=��"���������1�����-���������

�����O�1�����-�������?��������� �����,������ ������������������������)���:"

�����D���������'����������������������������"

�����Q��������,������N��������N����� ����N�����!)�4R!)�4R!�"��N��������N����� ����N�����!)�!)�!�"

228 Java. Sztuka programowania

�����G+<������������<��������,�������������������������������������������=��"���������'����'1�����,���������������������������"�������'����'1����������������������:������������������"�������+;�1����,��,���������������������������"���������������+;�1����,��������

�����P�,���1��-�����1�������������,�������������������)�������)��#�)������"

���������=�����������������)�������������������D��;����1��1L�1��,��'�����,��������6����P���������6����*������������������������������N�������6����9������������������>������#����"���������������"������&����&�"

�������D��;����1��������1�����������N�������P���������N�������*���������������������������������G��1�N�������9������������������������"������&����&�"

���������(���� �����"

�������� �����"

�������(���������������������1���1����������������������:�������������� ��������������������"����(�������������������)�!)��)�!)������������"����*�������������"�������� ���!�"������:� ����������34�"

������(�1����B��������/!!)�4/!��"

����������������(����������������M*GS����������K����A6�,����;��,���A�"����������P��������/R)�/R!�"�����������,"����������(N*KK9GS����������K����A6�,������,����A�"����������P��������/R!)�/R!�"�����������,"����������G9=OPDKS����������K����A6�,�������-�A�"����������P��������TUR)�/R!�"�����������,"����&

������>����������"��&

Rozdział 8. ♦ Statystyka i wykresy 229

�������������������=������������

����B�����������(�1� ���(�1��"������1������,������J��������� ���J������"������1�����������

�������G�1������,���������������-��1����,������I���8������#�� �����I���8�������"

�������D����1����������������'������������=��� �#��������6����AA�%�����������"

�������D����1�����1���,������1�����������������������#�� ������#��%��#�=���%�#������6����V!V�"�������� ���������%����=���%�#����*������"����������� ������������%�������=���%�#����*������"���������� �����������%������=��"

�����5�0����������?�����������-���������)��<�-�!�������-�,����-�������1 �,������������-����������?���,��������-����-���)��<�-�!��5������#�����@�!������ �!"�����#���:�$�!����:� �!"

�����5�D����1����;��?���'1��������������,�������5���������� ����������:�3�����"

�������D����1����+;�1����,��,������������������ ������������(�1�������3��������3������������"

�������O�1��-���;�<���������������������� �����������(�1�������3��������%�����5������"

�������D����1����;��?���'1�������������=��� �����(�1������3��#��3��������������������34�"

�������H�����,���������,����������N��������N�����"

�������7�����-����+;�1'�����������P����#�)�������)����������������#��%�����������34��5��=��)��������"

�������7�����-����E������#������(����W �M*G������������P����#�)����(�1������3������)��#�)�����"

�������6��������������������)���:���!����������(������A!A)������#�)�������%#����*�������/�"

�����#���:�W �!������������(������AA�%���:)������#�)��������3����������������������������:5������3�T�"�����#�����W �!������������(������AA�%����)������#�)��������3�����������������������������5�����%#����*�������"

230 Java. Sztuka programowania

�������6�������������������������(������AA�%����������)���������������������������34��5���=����%��#�)������������������������%�#����*�������"

�������H�����,�������������������N��������N�����"

�������6��������������������������(����������������M*GS�������������������"�����������,"����������(N*KK9GS�����������������"�����������,"����������G9=OPDKS�����������������"�����������,"����&��&

�����6������������,�����;��,���������������������������=���������������������"

����#�������� !"���$����������"��%%����������� ���������������5������"

�����������P����5�=��%�#�)�������)������������������5�=��%�#�)��������3���"����&��&

�����6������������,�������,��������������������������=���������������������"

����#�������� !"���$����������"��%%����������� ���������������5������"�����������G����5�=��%�#�)��������3��)�4)�4�"����&��&

�����6�,������,�����1����� �����-����������������������=���������������������"

����G�B������ �(���������������"

����#�������� !"���$����������"��%%����������� ���������������5������"�����������G����5�=��%�#�)��������3��)�4)�4�"����&

Rozdział 8. ♦ Statystyka i wykresy 231

�������G������������������-�����������P����#�)��������3�������������5�����)����������������=��5����������34�%�#�%4)����������������������3������������%����5����������34���5������"��&&

Zmienne klasy Graphs

Klasa ����� zaczyna się od zdefiniowania następujących zmiennych.

���(��;���1�-+����,��+���������#����������������M*G� �!"�������#����������������(N*KK9G� �4"�������#����������������G9=OPDK� �/"

����������������(���"

Pierwsze trzy zmienne typu !��"���� noszą nazwy #$�, �%$&&�� i ���'()&. War-tości te oznaczają różne typy wykresów. Typ wykresu jest przechowywany w zmiennej���������.

Następnie definiuje się zmienne przechowujące wielkość odstępu między granicąokna a początkiem obszaru wyświetlania danych na wykresie.

�5�D,���������?���-��������1��������������'1�����1������������,���'1� ��5��������#����������#�=��� �/"�������#������������=��� �/"�������#���������������=��� �/"����������������=��"���������1�����-���������

Wszystkie zmienne poza ������ są typu !��. Zmienna ������ 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.

���O�1�����-�������?��������� �����,������ ����������������������)���:"

���D���������'��������������������������"

Zmienne � i � przechowują minimalną i maksymalną wartość danych. Tablicaprzechowująca dane jest dostępna przez referencję ��.

Kolory używane przez wykres znajdują się w zmiennych ���%���� i ��%����.

���Q��������,����N��������N����� ����N�����!)�4R!)�4R!�"N��������N����� ����N�����!)�!)�!�"

Linie siatki są jasnozielone, natomiast dane są zaznaczane na czarno. Oczywiście możnazmienić te kolory na dowolne inne.

232 Java. Sztuka programowania

Następnie deklaruje się różne zmienne związane ze skalowaniem.

���G+<������������<��������,�����������������������������������������=��"���������'����'1�����,�������������������������"�������'����'1����������������������:����������������"�������+;�1����,��,�������������������������"���������������+;�1����,��������

Odległość między punktami danych na osi X zawiera zmienna ���. Liczbę jednostekmiędzy wartością minimalną a maksymalną przechowuje zmienna �����. Współczyn-nik skali znajduje się w zmiennej ����. Pionowe położenie linii bazy (czyli osi X)znajduje się w zmiennej ������.

Na końcu zadeklarowano obszary ���, ����� , ��!� i ����.

���P�,���1��-�����1�������������,�����������������)�������)��#�)������"

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ć�����#$�, ������%$&&�� lub ��������'()&.

W konstruktorze najpierw należy przypisać nasłuchiwanie zdarzenia zamykania okna.

���D��;����1��1L�1��,��'�����,����6����P���������6����*��������������������������N�������6����9��������������>������#����"�����������"��&&�"

Nasłuchiwanie dodaje się przez wywołanie metody ��*���+(�������� i przekaza-nie obiektu *���+$�����, w którym przysłonięto metodę +���+%�������. Wartoprzypomnieć, iż klasa adapterowa zawiera puste implementacje wszystkich metodwymaganych przez dany interfejs. W tym przypadku adapter *���+$����� imple-mentuje interfejs *���+(������. Adapter zapewnia puste implementacje wszystkichwymaganych metod, zatem trzeba tylko przysłonić odpowiednią metodę, w tym przy-padku +���+%�������.

W przypadku zamykania okna należy je ukryć wywołując polecenie ���������!����.Następnie usuwa się okno z systemu poleceniem ��������. Metody te są zdefinio-wane dla okien � � z AWT.

Następnie należy dodać nasłuchiwanie zdarzeń zmiany rozmiaru okna. Wywołuje sięmetodę ��%� ������(�������� i przekazuje obiekt %� ������$�����, który przy-słania metodę �� ���������,����.

Rozdział 8. ♦ Statystyka i wykresy 233

���D��;����1��������1�������N�������P���������N�������*�����������������������������G��1�N�������9��������������������"��&&�"

W przypadku zmiany rozmiaru okna metoda �� ���������,���� wywołuje metodę�������, co natomiast powoduje wywołanie metody �����. Jak za chwilę Czytelnikzobaczy, metoda ����� dynamicznie zmienia skalę na podstawie aktualnego rozmiaruokna. Po zmianie rozmiaru cały wykres jest rysowany od nowa z wykorzystaniemnowych wymiarów.

Następnie do zmiennych ��������� i �� należy przypisać otrzymane dane i utwo-rzyć tymczasową kopię danych. Dane są sortowane w kopii tablicy. Z posortowanejtablicy danych pobiera się wartość minimalną i maksymalną. Kod wykonujący tozadanie przedstawiono poniżej.

�����(���� �����"

���� �����"

���(���������������������1���1����������������������:���������� ��������������������"(�������������������)�!)��)�!)������������"*�������������"���� ���!�"��:� ����������34�"

Konstruktor klasy kończy się następującym kodem.

��(�1����B��������/!!)�4/!��"

������������(������������M*GS������K����A6�,����;��,���A�"������P��������/R)�/R!�"�������,"������(N*KK9GS������K����A6�,������,����A�"������P��������/R!)�/R!�"�������,"������G9=OPDKS������K����A6�,�������-�A�"������P��������TUR)�/R!�"�������,"&

��>����������"

Najpierw ustala się początkowy rozmiar okna wykresu na 200 pikseli w poziomiei 120 w pionie, wywołując metodę ����,���. Potem na podstawie wartości zmiennej��������� przypisuje się odpowiedni tytuł, używając metody ���&�����. Dodatkowonależy ustalić także położenie okna poleceniem ���(�������. Na samym końcu włączasię wyświetlanie okna poleceniem ��������������. Powoduje to odrysowanie oknametodą �����.

234 Java. Sztuka programowania

Metoda paint()

Większość zadań związanych z wyświetlaniem wykresu jest wykonywana przez metodę�����. Wykonuje ona następujące działania.

� Odczytuje rozmiar okna oraz rozmiar granicy.

� Pobiera rozmiar aktualnie wybranej czcionki.

� Oblicza rozmiar obszaru danych wewnątrz okna. Jest to rozmiar okna minusgranice i ewentualne odstępy.

� Oblicza współczynnik skali.

� Oblicza współrzędną Y podstawy wykresu, czyli oś X.

� Rysuje podstawę oraz oś Y.

� Wyświetla minimalne i maksymalne wartości X i Y.

� Wywołuje odpowiednią metodę rysowania w celu wykonania wykresu.

Komentarze w metodzie ����� wyjaśniają kolejne działania, ale sama metoda jestbardzo prosta. Jest to jednak najważniejsza metoda klas, zatem prześledzimy ją wierszpo wierszu.

Metoda zaczyna się następującymi deklaracjami.

B�����������(�1� ���(�1��"������1������,��J��������� ���J������"������1�����������

Okno � � składa się z dwóch głównych części: granicy, w której skład chodzi obra-mowanie, pasek tytułowy i menu (jeśli istnieje) oraz głównego obszaru wyświetlaniadanych. Rozmiar okna pobiera się poleceniem ����,���. Metoda ta zwraca ogólnewymiary okna w postaci obiektu � �����. Referencja do zwróconego obiektu znajdziesię w zmiennej +��,�. Obiekt � ����� zawiera dwa pola: +��� i �����. Z tegopowodu ogólne wymiary okna odczytuje się jako +��,��+��� i +��,�������.

Aby znaleźć obszar okna, w którym można wyświetlać dane, trzeba od ogólnego roz-miaru okna odjąć granice. Do tego celu służy metoda ���-�������. Zwraca ona wymiarygranic w postaci obiektu -����� zawierającego pola ��!�, ����, ��� i ����� . Refe-rencja do tego obiektu jest przechowywana w ��. Należy pamiętać, iż współrzędnymilewego górnego narożnika okna są 0, 0. Z tego powodu lewy górny narożnik obszarudanych to �����!� i ������, natomiast prawy dolny narożnik to +��,��+���.������� i +��,�������.�������� .

Następnie metoda ����� pobiera metrykę aktualnie wybranej czcionki.

���G�1������,���������������-��1����,��I���8������#�� �����I���8�������"

Informacje znajdujące się w zmiennej ! posłużą później do obliczenia wysokościi szerokości znaków używanych do wyświetlenia zakresu.

Rozdział 8. ♦ Statystyka i wykresy 235

Choć granica określa maksymalny użyteczny obszar okna, nie zawsze jest to obszarnajlepszy ze względów estetycznych. Najczęściej warto pozostawić niewielki odstępmiedzy danymi a granicą. Z tego powodu dostępny obszar dodatkowo redukujemywartościami ��!���, �����, ����� �� i ������. Trzy pierwsze zmienne zawierająwartość 2, ale ostatnią zmienną oblicza się na podstawie szerokości tekstu zawierają-cego liczbę elementów w zbiorze.

���D����1����������������'��������=��� �#��������6����AA�%�����������"

Tekst wyświetlający liczbę elementów znajduje się po prawej stronie, zatem należyprzygotować dla niego odpowiednią ilość miejsca. Właśnie z tego powodu należałopobrać metrykę czcionki poleceniem ��� �����������. Stosując metodę �����*�����uzyskanego obiektu można ustalić odpowiedni odstęp i przypisać go do ������.

Teraz oblicza się łączne odstępy po każdej stronie, używając wszystkich zebranychwartości. Wyniki zapisujemy w zmiennych ��!�, ����, ��� i ����� .

���D����1�����1���,������1�������������������#�� ������#��%��#�=���%�#������6����V!V�"���� ���������%����=���%�#����*������"������� ������������%�������=���%�#����*������"������ �����������%������=��"

Warto zauważyć, iż pozostawiono miejsce na wyświetlenie zakresu danych.

Następnych kilka wierszy oblicza współczynnik skali.

�5�0����������?�����������-���������)��<�-�!���-�,����-�������1 �,��������-����������?���,��������-����-���)��<�-�!��5��#�����@�!������ �!"�#���:�$�!����:� �!"

�5�D����1����;��?���'1��������������,�������5������ ����������:�3�����"

���D����1����+;�1����,��,�������������� ������������(�1�������3��������3������������"

Proces zaczyna się od normalizacji wartości w � i �. Wszystkie wykresy mają swójpoczątek w punkcie 0, 0. Jeżeli więc wartość minimalna jest większa od 0, należyustawić � na 0. Jeżeli wartość maksymalna jest mniejsza od 0, należy ustawić �na 0. Następnie oblicza się odstęp między � i �. Uzyskaną wartość używa się doobliczenia współczynnika skalowania przechowywanego w zmiennej ����.

Po obliczeniu współczynnika skalowania położenie linii bazy znajduje się skalującwartość � w sposób przedstawiony poniżej.

���O�1��-���;�<�����1��������� �����������(�1�������3��������%�����5������"

Jeżeli � wynosi zero, linia bazy znajdzie się na dole okna. W innym przypadku znaj-dzie się gdzieś w jego środkowej części. Jeżeli wszystkie wartości są ujemne, znajdziesię na górze.

236 Java. Sztuka programowania

Odstęp między danymi jest określany za pomocą dzielenia szerokości obszaru danychprzez liczbę elementów.

���D����1����;��?���'1���������=��� �����(�1������3��#��3��������������������34�"

W następnym kroku ustawia się aktualny kolor na ���%����. Rysuje się osie i zakresy.Oto kod wykonujący to zadanie.

���H�����,���������,������N��������N�����"

���7�����-����+;�1'�������P����#�)�������)��#��%�����������34��5��=��)��������"

���7�����-����E��#������(����W �M*G��������P����#�)����(�1������3������)��#�)�����"

���6��������������������)���:���!������(������A!A)������#�)�������%#����*�������/�"

�#���:�W �!��������(������AA�%���:)������#�)��������3����������:5������3�T�"�#�����W �!��������(������AA�%����)������#�)��������3�����������5�����%#����*�������"

���6���������������������(������AA�%����������)����������������������34��5���=����%��#�)��������������������%�#����*�������"

Ważnym jest, iż dla wykresu słupkowego nie wyświetla się osi Y. Poza tym maksy-malny zakres wyświetla się tylko wtedy, jeżeli nie jest on zerowy. Podobnie ma sięsprawa z zakresem minimum. Wysokość znaków określa ich położenie w oknie.

W kolejnym kroku należy ustawić kolor na ��%���� i wywołać odpowiednią metodęrysowania wykresu.

���H�����,���������������N��������N�����"

���6����������������������(������������M*GS���������������"�������,"������(N*KK9GS�������������"�������,"������G9=OPDKS�������������"�������,"&

Rozdział 8. ♦ Statystyka i wykresy 237

Metoda bargraph()

Metoda �������� skaluje poszczególne elementy danych a następnie wyświetla linię,której długość jest proporcjonalna do tych danych. Linia jest rysowana od podstawy.Oto kod metody.

���6������������,�����;��,�������������������������=�������������������"

��#�������� !"���$����������"��%%��������� ���������������5������"

���������P����5�=��%�#�)�������)����������������5�=��%�#�)��������3���"��&&

Skoro tak wiele zadań zostało już wykonanych w metodzie �����, metoda ��������tylko skaluje poszczególne elementy za pomocą współczynnika skalowania a następnierysuje linie. Linie zaczynają się od podstawy, czyli od osi X. Punkt końca oblicza sięprzez odejmowanie skalowanej wartości od ������. Należy pamiętać, iż współrzędnelewego górnego narożnika okna mają wartość 0, 0. Z tego powodu mniejsze wartościY znajdują się wyżej w oknie niż większe wartości Y. Z powyższego wynika, że od������ należy odjąć wartość �. Odstęp między słupkami wynosi ���. Położenie Xkażdego słupka jest obliczane przez pomnożenie indeksu elementu przez wielkośćodstępu i dodanie wartości przesunięcia względem lewej krawędzi (zmienna ��!�).

Metoda scatter()

Metoda �������� działa bardzo podobnie jak metoda �������� ale rysuje punktyzamiast linii. Oto kod metody.

���6������������,�������,������������������������=�������������������"

��#�������� !"���$����������"��%%��������� ���������������5������"���������G����5�=��%�#�)��������3��)�4)�4�"��&&

Metoda �������� skaluje poszczególne elementy danych a następnie wyświetla punktna osi Y, którego odległość od początku osi X jest proporcjonalna do tych danych.

Metoda regplot()

Podobnie jak metoda ��������, metoda ��������� rysuje punkty na wykresie. Różnicapolega na tym, iż dodatkowo rysuje także linię regresji, używając funkcji ���������.

238 Java. Sztuka programowania

���6�,������,�����1����� �����-��������������������=�������������������"

��G�B������ �(���������������"

��#�������� !"���$����������"��%%��������� ���������������5������"���������G����5�=��%�#�)��������3��)�4)�4�"��&

�����G������������������-���������P����#�)��������3�������������5�����)��������������=��5����������34�%�#�%4)��������������������3������������%����5����������34���5������"&

Warto zwrócić uwagę na sposób rysowania linii regresji. W wywołaniu ��+(����punkt końcowy linii regresji jest obliczany na podstawie wartości ��� i ����, czylimiejsca przecięcia osi Y i linii regresji.

Aplikacja tworzenia statystyk

Dzięki klasom ���� i ����� można wykonać prostą, ale użyteczną aplikację. Główneokno aplikacji powstaje dzięki klasie ����*�, której kod przedstawiono poniżej.

�������-��������5"�������-������������5"�������-���������5"�������-�����:��5"

���O�1����1������������������������������1������������������(����6���:����I����������������J��P�����)�*�����P��������

��7����I�������#� �7����I��������J��������"

��K:�*��������K*"��N��,��:����� ����N��,��:�A6�,����;��,���A�"��N��,��:�������� ����N��,��:�A6�,������,����A�"��N��,��:�������� ����N��,��:�AP���������-�A�"��N��,��:�������� ����N��,��:�AO�,�<���A�"

������������"

��=��������"��=��������"��=��������"��B���6����"

��G�B�����"

Rozdział 8. ♦ Statystyka i wykresy 239

���������(����6������������������������� �����"����1�����'��-��#���-'��������

�����6����P���������6����*������������������������������N�������6����9�������������������������"������&����&�"

�������H����1���������������8����"

���������������,;����,��)�����������,�������+��������P���������I���P������I���P������N97K9G��"

������(�1����B��������X!!)�/T!��"������K����A(�����������B���A�"

������ �(���������������"

�������H��������#�������1�/���-�����������1���,�������#���8�:����I�������B������/�"

�������Q������,�-����-���������(����������"������������������O����������)�-���������-������������ ��#�#������(�������������"����&�������7�8�9:�������:��������������� �:����(�������"����&

����(���������� �AY����S�A�%�������������������#�#������(���������������%�AZ�A�%�����������������A8����S�A�%�������������������#�#������(����������������%�AZ�A�%�����������������A8��S�A�%������%�AZ�A�%�����������������AD��������������S�A�%�������������������#�#������(�������B��������%�AZ�Z�A�%�����������������AG+����������-�S�A�%���C�������%�����������������AZ�6��+;�1����,�,�����-�S�A�%�������������������#�#������������"

�������H���1�1�����-�������������,����������������K*� ����K:�*������)�[)�X\)�K:�*���(NGDPPM*G(]7D79�"���������K*���9������#����"

�������B�����,�������+�����,��������������K*�"����������"�������������"�������������"�������������"

�������B��������;�������������������J��P�����������"

240 Java. Sztuka programowania

������������J��P�����������"������������J��P�����������"������������J��P�����������"

������>����������"��&

�����D��;����1���,������,����������������������O�#����*�����9������������(���������� ��(����������*�����N�������"

�����#����� �AN���A������������������"����&��&

�����H<��,����,�1����;����-'�����������������(���N�����J��9�������������#�������(���������������#���� ������������������� ����=���������)�=������M*G�"������������6����P���������6����*����������������������������������N�������6����9��������������������������(����#����"��������������� �����"����������&��������&�"������&����&���������������#����W ��������������������������"����������� �����"������&����&

�����#����������(���������������#���� ������������������� ����=���������)�=������(N*KK9G�"������������6����P���������6����*����������������������������������N�������6����9�����������������������������(����#����"��������������� �����"����������&��������&�"������&����&���������������#����W ��������������������������"����������� �����"������&����&

�����#����������(���������������#���� ������������������� ����=���������)�=������G9=OPDK�"

Rozdział 8. ♦ Statystyka i wykresy 241

������������6����P���������6����*����������������������������������N�������6����9�����������������������������(����#����"��������������� �����"����������&��������&�"������&����&���������������#����W ��������������������������"����������� �����"������&����&

�����#����������(���������������#��� ������������������ ����B���6�������"�����������6����P���������6����*����������������������������������N�������6����9�����������������������������(����#����"�������������� �����"����������&��������&�"������&����&���������������#���W �������������������������"���������� �����"������&����&��&

�����H����1������������������������8�����������8��M�������� ����8��M����"������8��M��������"

����8���#��� ����8���AO��,A�"����8��J�������� ����8��J���A���,��-A�"����#����������"�����������#���"����������*�����P�����������"��&

��������,��'����,��������������������������������#����W �����������������"�����#����W �����������������"�����#����W �����������������"�����#���W ����������������"������>������#����"�����������"��&&

242 Java. Sztuka programowania

Klasa ����*� rozszerza klasę � � w celu utworzenia okna głównego, w którym będąwyświetlane informacje statystyczne. Zawiera także opcje umożliwiające użytkowni-kowi wybór sposobu prezentacji danych. Klasa implementuje interfejsy -�� (������i $����(������.

Klasa zaczyna się od pobrania obiektu �� ��� �� �. Klasa �� ��� �� � jest pomocnaw formatowaniu danych numerycznych. Klasa ����*� używa tej klasy do określenialiczby miejsc po przecinku, jaka ma być wyświetlana.

W dalszej części klasa deklaruje kilka zmiennych przechowujących referencje do ele-mentów graficznych interfejsu. Dotyczy to pola tekstowego, czterech opcji i trzechobiektów �����. Referencja do obiektu ��*� jest przechowywana w zmiennej �.Klasa ��*� jest oknem wyświetlającym analizowane dane numeryczne. Referencjado danych znajduje się w zmiennej �� a referencja do danych regresji w zmiennej ��.

Konstruktor klasy StatsWin

Do konstruktora przekazuje się referencję do analizowanych danych. Konstruktor prze-prowadza analizę statystyczną dla wprowadzonych danych. Większość kodu konstruktorajest prosta, więc zostanie omówiony tylko w ogólny sposób.

Na początku zapamiętuje się referencję do danych. Następnie dodaje się nasłuch dlazdarzenia zamknięcia okna. W przypadku wystąpienia takiego zdarzenia, następujewywołanie metody ������+���, która zamyka wszystkie okna otwarte przez ����*�.

Następnie konstruktor tworzy menu, używając do tego metody �����������. Menuzawiera tylko jedno polecenie: Zamknij. Wybranie go powoduje wyłączenie aplikacji.

W kolejnym kroku ustalamy w menedżerze układu okna układ z centrowaniem. Jestto konieczne, gdyż klasa � � domyślnie stosuje układ graniczny.

W następnym kroku ustawia się tytuł okna, jego rozmiary oraz pobiera się dane regresji.Należy także ustawić format liczbowy na dwa miejsca po przecinku, używając poniż-szego kodu.

�#���8�:����I�������B������/�"

Jak wspomniano wcześniej, �! odnosi się do obiektu �� ��� �� �. Jest to obiekt wy-korzystywany między innymi do opisu wyświetlania wartości numerycznych. Metoda����� � ����������� pozwala na ustalenie maksymalnej liczby cyfr wyświe-tlanej po przecinku. Klasa ����*� wykorzystuje ten obiekt do ustawienia całegowyświetlania danych. Aby zobaczyć więcej miejsc po przecinku, należy przekazaćwiększą wartość do metody ����� � �����������.

Kilka następnych wierszy tworzy wynikowy tekst z wynikami różnych analiz staty-stycznych.

���Q������,�-����-�����(����������"

Rozdział 8. ♦ Statystyka i wykresy 243

����������O����������)�-���������-�������� ��#�#������(�������������"&�������7�8�9:�������:����������� �:����(�������"&

(���������� �AY����S�A�%��������������#�#������(���������������%�AZ�A�%�������������A8����S�A�%��������������#�#������(����������������%�AZ�A�%�������������A8��S�A�%������%�AZ�A�%�������������AD���������������S�A�%��������������#�#������(�������B��������%�AZ�Z�A�%�������������AG+����������-�S�A�%���C�������%�������������AZ�6��+;�1����,�,�����-�S�A�%��������������#�#������������"

Interesujący jest sposób pobierania informacji o modzie. Należy pamiętać, iż metoda ����� zwraca wyjątek, gdy próbka nie zawiera wartości mody. Zmienna ��� zawieraalbo informację o modzie, albo wyjaśnienie, iż moda dla danej próbki nie istnieje.

Po wykonaniu całego tekstu ��� jest on umieszczany w obiekcie &���$�� dostępnymdzięki zmiennej ����&$. Obiekt ten następnie ustawia się na tryb tylko do odczytu za po-mocą polecenia ����������!����. W ten sposób możliwy jest tylko odczyt informacji.

Następnie należy dodać do okna poszczególne elementy interfejsu oraz elementynasłuchujące. Obszar tekstowy jest obszarem tylko do odczytu, zatem nie wymagaustawienia nasłuchu. Na końcu należy wyświetlić okno.

Procedura obsługi itemStateChanged()Wiele działań klasy ����*� zachodzi w metodzie �� ����%�������. Metoda taobsługuje zmiany zaznaczenia czterech opcji. Gdy użytkownik włączy daną opcję,wyświetlane jest związane z nią okno. Gdy wyłączy opcję, dane okno jest zamykane.Aby zrozumieć sposób działania tego procesu, można prześledzić kod służący doobsługi zmian opcji wykresu słupkowego. Oto kod.

�#�������(�����������#���� ��������������� ����=���������)�=������M*G�"��������6����P���������6����*������������������������������N�������6����9����������������������(����#����"����������� �����"������&����&�"��&&�������#����W ����������������������"������� �����"��&&

244 Java. Sztuka programowania

Najpierw pobiera się stan obiektu za pomocą zmiennej �� i metody ���������. Jeżelizostanie zwrócona wartość ����, opcja jest włączona. W przeciwnym razie jest wyłą-czona. Jeżeli opcja jest włączona a zmienna �� zawiera wartość ����, okno wykresusłupkowego jest włączane po raz pierwszy. W tym przypadku do �� przypisuje sięnowy obiekt ����� wyświetlający wykres słupkowy. Gdy �� jest różne od ����, poprostu nic nie trzeba robić, gdyż okno istnieje.

W trakcie tworzenia nowego okna należy dodać nasłuch monitorujący okno. Intere-sująca jest informacja o zdarzeniu zamykania okna. W ten sposób obiekt ����*�otrzymuje informację o zamykaniu okna wykresu. W momencie otrzymania powia-domienia o zamykaniu okna należy wyłączyć opcję i ustawić �� na ����.

Jeżeli użytkownik wyłączył opcję a okno było otwarte, należy zamknąć okno metodą�������� i ustawić �� na ����. Ten sam mechanizm stosuje się dla wszystkich czte-rech opcji.

Metoda actionPerformed()

Metoda ����'��!�� ���� obsługuje zamykanie programu za pomocą polecenia Zamknijz menu. Metoda po prostu wywołuje inną metodę o nazwie ������+���.

Metoda shutdown()

W momencie zamykania okna ����*� jest wywoływana metoda ������+���. Zamykaona wszystkie okna otwarte przez obiekt ����*�, dotyczy to zarówno głównego okna,jak i okien wykresów i danych. Z tego powodu z ekranu znikają wszystkie wykresy,choć są one wyświetlane w niezależnych oknach.

Metoda createMenu()

Metoda ����������� tworzy menu aplikacji. Najpierw tworzy się obiekt ����#�i umieszcza się go w zmiennej ��. Następnie powstaje obiekt ���� o nazwie !��,w którym umieszcza się obiekt ����-�� o nazwie �����. Następnie obiekt ����*�staje się odbiorcą akcji z menu. W ten sposób zdarzenia akcji wygenerowane przezmenu będą trafiały do opisanej wcześniej metody ����'��!�� ����.

Klasa DataWin

Klasa ����*� wykorzystuje obiekt ��*� do wyświetlenia wejściowych danychliczbowych poddawanych analizie. Oto postać klasy ��*�.

�������-������������5"�������-��������5"

���6��������������'�������������1�����������B���6���:����I�������K:�*������K*"

Rozdział 8. ♦ Statystyka i wykresy 245

��B���6���������������������6����P���������6����*������������������������������N�������6����9������������������>������#����"���������������"������&����&�"

�������K*� ����K:�*���4!)�4!�"�������K*���9������#����"

����#�������� !"���$����������"��%%����������K*������������%AZ�A�"

������(�1����B��������4!!)�4T!��"������P��������X/!)�4!!�"

������K����AB��A�"������G��1����#����"

���������K*�"

������>����������"��&&

Klasa ��*� rozszerza klasę � � i tworzy główne okno. Konstruktor klasy przyjmujejako parametr referencję do tablicy danych do wyświetlenia. Następnie tworzy obiekt&���$�� wyświetlający dane. Obszar tekstowy jest ustawiany tylko do odczytu bezmożliwości zmiany skali. Okno można zminimalizować.

Łączymy wszystko razem

Poniższy program przedstawia sposób wykorzystania klas ���� i �����.

���B�������-�1��;����,����(�������=�������������-�������5"�������-��������5"

������B��(������������������������������(������������������������JD9:������������������������� ���4!)�4!)�44)�^)�\)�\)�^)����������������������4!)�4!)�4X)�44)�44)�44)����������������������44)�4/)�4X)�4T)�4[)�4U)����������������������4R)�4R)�4[)�4T)�4[�&"

�������(����6��������"��&&

Aby skompilować program, należy wydać następujące polecenie:

-�����B��(����-����B���6���-����(����6���-����(�����-����=������-���

246 Java. Sztuka programowania

Aby uruchomić program, należy wpisać następujące polecenie.

-�����B��(���

Warto zauważyć, iż używamy programu /�+ (zamiast /�), aby uruchomić aplikacjębez okna konsoli. Zastosowanie /�+ zapewnia odpowiednie wyłączenie programupo zamknięciu głównego okna. W Java 1.4 można zastosować polecenie /�, ale wewcześniejszych wersjach konieczne jest użycie /�+. Rysunki od 8.2 do 8.4 przed-stawiają działanie klas statystyk.

Rysunek 8.2.

Główne okno

StatsWin

Rysunek 8.3.

Okna wykresów

Jedną z bardziej interesujących funkcji programu jest możliwość dowolnego skalo-wania wykresów, gdyż znajdują się one w osobnych oknach. Gdy użytkownik zmienirozmiar okna, wykres automatycznie zmieni skalę. Można także zminimalizować oknowykresu. Zapewnia to usunięcie okna z ekranu, ale nie z systemu.

Rozdział 8. ♦ Statystyka i wykresy 247

Rysunek 8.4.

Efekt zmiany

rozmiaru jednego

z okien

Prosty aplet ze statystykami

W poprzednim podrozdziale pokazano sposób wykonania samodzielnej aplikacjikorzystającej z klas ���� i �����. Nie jest to jednak jedyne zastosowanie tych klas.Równie dobrze klasy te mogą wspomagać aplety lub serwlety. Poniżej przedstawionoprzykład prostego apletu. Powoduje on wyświetlanie informacji statystycznych dladowolnych przekazanych do niej danych.

���O�1�,;����������,��1����- ����(�������=�������������-��������5"�������-������������5"�������-����������5"�������-���������5"�5��$�������� A(���*����A����� 4/!������ R!@��$��������� �������� A4�/)�X�[)�R�U)�T�T)�U�4)�T�T)��������������������������[�\^)�\�^)�4!�X)�^�TRA@��$������@5�

�������������(���*�����:����*��������������*�����P���������(����6�����"��M����������"

��*����P������� ����*����P�����"

�������������������������(�����K�,��1����� ���������(�����K�,��1����O�������A���A�)�A)�Z�Z�A�"

248 Java. Sztuka programowania

����(�������"

�������D�1���������������1�_K8P����������������8��K�,��������������� �����:�K�,���"�������������"����&

��������� ����M������A6���������������,�A�"�����������"

����������*�����P�����������"��&

�������������������O�#����*�����9��������

�����#���� �������������������������� ��������������1���"�������������������#�������� !"��$�����1��"��%%������������������� �B���������B������(���������������"������&�������7����I�����9:�������:������������(�����������������AM; ���1����������A�"�������������"������&

��������� ����(����6��������"�������������9�����#����"

����������6����P���������6����*��������������������������������N�������6����9��������������������� �����"�����������������9���������"��������&������&�"����&��&&

Ważnym jest, iż przekazywanie danych odbywa się za pomocą parametru HTMLo nazwie ��. Tekst zawiera wartości oddzielone przecinkami. Klasa ���$�����wykorzystuje obiekt �����&�0��,�� do pobierania poszczególnych wartości jakoobiektów �����. Następnie wartości są zapamiętywane w obiekcie $���(�� o nazwie�. Klasa $���(�� umożliwia przechowywanie tablic o dynamicznie zmieniającejsię długości.

Gdy użytkownik kliknie przycisk Wyświetl statystyki, wykonywana jest metoda ����1'��!�� ����. Obiekt ����*� wymaga tablicy obiektów ������ jako parametr, więcnależy dokonać konwersji danych tekstowych � do tablicy wartości ������. W tensposób powstaje obiekt ����*� ze statystykami.

Przykładowy wynik został uzyskany za pomocą programu Applet Viewer. Zaprezen-towano go na rysunku 8.5. Tego rodzaju aplet jest doskonałym dodatkiem do wielustron WWW.

Rozdział 8. ♦ Statystyka i wykresy 249

Rysunek 8.5.

Przykład działania

apletu StatApplet

Możliwe udoskonalenia

Oto kilka pomysłów na udoskonalenie projektu. Jak już wspomniano, metody rysowaniawykresów i metoda ��������� mogą działać tylko na danych dla wartości Y. Warto-ściami osi X są punkty w czasie. Można jednak zmienić działanie programu na takie,w którym jako argumenty podaje się dwie tablice — druga z tablic zawiera wartości X.

Interesujące może okazać się umożliwienie zamiany osi, na przykład w czasie rzeczy-wistym. Użytkownik powinien mieć możliwość ustalenia szerokości słupków lub teżkształtu punktów.

Na końcu można poeksperymentować z osadzaniem okna wykresu wewnątrz okna����*� zamiast tworzenia osobnych okien. Można na przykład określać za pomocąlisty opcji, jaki typ wykresu ma być wyświetlany w oknie wykresu.