JAVA 08 Nieznany

background image

Programowanie obiektowe (Java) – 8

1

Teksty

W Javie istnieją tylko dwa przeciążone operatory + oraz + = dla klasy String. Przy ich użyciu można

łączyć teksty. Połączenie tekstu ze zmienną typu prostego skutkuje powstaniem nowego tekstu będącego
połączeniem tekstu pierwotnego i reprezentacji tekstowej tej zmiennej. Natomiast w wyniku połączenia tekstu
z obiektem powstanie nowy tekst składający się z pierwotnego tekstu oraz reprezentacji tekstowej tego obiektu
(wyniku, który zwróciła metoda toString() dla tego obiektu).

1.1

Podstawowe metody z klasy String

Podstawowe metody z klasy String służące do porównywania tekstów oraz ich fragmentów

1

• metody służące do porównywania tekstów z uwzględnieniem wielkości liter (equals()) lub bez uwzględ-

nienia wielkości liter (equalsIgnoreCase()):

1

public boolean

equals(Object anObject)

2

public boolean

equalsIgnoreCase(String anotherString)

• metody służące do porównywania tekstów z obiektami klas CharSequence i StringBuffer :

1

public boolean

contentEquals(CharSequence cs)

2

public boolean

contentEquals(StringBuffer sb)

• metody służące do porównywania leksykograficznego tekstów z uwzględnieniem wielkości liter (compa-

reTo()

) lub bez uwzględnieniem wielkości liter (compareToIgnoreCase()):

1

public int

compareTo(String anotherString)

2

public int

compareToIgnoreCase(String str)

• metody służące do sprawdzanie czy tekst zawiera prefiks lub sufiks:

1

public boolean

endsWith(String suffix)

2

public boolean

startsWith(String prefix)

3

public boolean

startsWith(String prefix,

int

toffset)

• metody służące do porównywania wybranych regionów tekstu:

1

public boolean

regionMatches(

boolean

ignoreCase,

int

toffset, String other,

int

ooffset, ←֓

int

len)

2

public boolean

regionMatches(

int

toffset, String other,

int

ooffset,

int

len)

• metoda służąca do porównywania z wykorzystaniem wyrażeń regularnych:

1

public boolean

matches(String regex)

Podstawowe metody z klasy String służące do operowania na tekstach

2

• metody służące do pobierania fragmentu tekstu w postaci tekstu lub sekwencji znaków:

1

http://docs.oracle.com/javase/tutorial/java/data/comparestrings.html

http://docs.oracle.com/javase/7/docs/api/java/lang/String.html

2

http://docs.oracle.com/javase/tutorial/java/data/manipstrings.html

http://docs.oracle.com/javase/7/docs/api/java/lang/String.html

1

background image

1

public

String substring(

int

beginIndex)

2

public

String substring(

int

beginIndex,

int

endIndex)

3

public

CharSequence subSequence(

int

beginIndex,

int

endIndex)

• metody służące do podziału tekstu na fragmenty:

1

public

String[] split(String regex)

2

public

String[] split(String regex,

int

limit)

• metoda usuwająca białe spacje z początku oraz końca tekstu:

1

public

String trim()

• metody konwertujące tekstu na małe lub wielkie litery:

1

public

String toLowerCase()

2

public

String toUpperCase()

3

public

String toUpperCase(Locale locale)

• metody wyszukujące pojawienie się pierwszego (lub ostatniego) wystąpienia poszukiwanego znaku (lub

podtekstu):

1

public int

indexOf(

int

ch)

2

public int

indexOf(String str)

3

public int

lastIndexOf(

int

ch)

4

public int

lastIndexOf(String str)

5

public int

indexOf(

int

ch,

int

fromIndex)

6

public int

indexOf(String str,

int

fromIndex)

7

public int

lastIndexOf(

int

ch,

int

fromIndex)

8

public int

lastIndexOf(String str,

int

fromIndex)

• metoda umożliwiająca sprawdzenie czy tekst zawiera podaną sekwencję znaków:

1

public boolean

contains(CharSequence s)

• metoda zwracająca nowy tekst utworzony poprzez zastąpienie elementów tekstu pierwotnego:

1

public

String replace(

char

oldChar,

char

newChar)

2

public

String replace(CharSequence target, CharSequence replacement)

3

public

String replaceAll(String regex, String replacement)

4

public

String replaceFirst(String regex, String replacement)

• zwraca tekst będący tekstową reprezentacją podanego argumentu:

1

public static

String valueOf(

boolean

b)

2

public static

String valueOf(

char

c)

3

public static

String valueOf(

char

[] data)

4

public static

String valueOf(

char

[] data,

int

offset,

int

count)

5

public static

String valueOf(

double

d)

6

public static

String valueOf(

float

f)

7

public static

String valueOf(

int

i)

8

public static

String valueOf(

long

l)

9

public static

String valueOf(Object obj)

• metody zwracające sformatowany tekst:

2

background image

1

public static

String format(Locale l, String format, Object... args)

2

public static

String format(String format, Object... args)

• metody zwracają znak (charAt() zwraca char) lub punkt kodowy Unicode (codePointAt() zwraca int)

spod podanego indeksu:

1

public char

charAt(

int

index)

2

public int

codePointAt(

int

index)

• metody umożliwiające pobranie tekstu lub jego fragmentu jako tablicy bajtów lub znaków:

1

public byte

[] getBytes()

2

public byte

[] getBytes(Charset charset)

3

public byte

[] getBytes(String charsetName)

throws

UnsupportedEncodingException

4

public void

getChars(

int

srcBegin,

int

srcEnd,

char

[] dst,

int

dstBegin)

5

public char

[] toCharArray()

• metoda łącząca dwa teksty:

1

public

String concat(String str)

• metoda zwracająca długość tekstu:

1

public int

length()

• metoda zwracająca true jeżeli metoda length() zwraca 0:

1

public boolean

isEmpty()

1

package

pl.kielce.tu.lab8;

2
3

public class

TestCompare {

4

public static void

main(String[] args) {

5

String s1 =

new

String(

"TEST"

);

6

String s2 =

new

String(

"TEST"

);

7

System.out.println((s1 == s2));

8

System.out.println(s1.equals(s2));

9

System.out.println(s1.equalsIgnoreCase(s2));

10

System.out.println();

11
12

String s3 =

"TEST"

;

13

String s4 =

"TEST"

;

14

System.out.println((s3 == s4));

15

System.out.println(s3.equals(s4));

16

System.out.println(s3.equalsIgnoreCase(s4));

17

}

18

}

Przykład 1: src/pl/kielce/tu/lab8/TestCompare.java {link}

1

false

2

true

3

true

4

3

background image

5

true

6

true

7

true

1.2

Niemodyfikowalność tekstów

W Javie obiekty klasy String są niezmienne. Znaczy to, że metody wywoływane na rzecz obiektu nie

wprowadzają w nim zmian, ale na podstawie aktualnego obiektu tworzony jest nowy, który odzwierciedla te
zmiany.

1

package

pl.kielce.tu.lab8;

2
3

public class

TestImmutability {

4

public static void

main(String[] args) {

5

String s =

"AbCdE"

;

6

System.out.println(s);

7

s.toLowerCase();

8

System.out.println(s);

9

s = s.toLowerCase();

10

System.out.println(s);

11

}

12

}

Przykład 2: src/pl/kielce/tu/lab8/TestImmutability.java {link}

1

AbCdE

2

AbCdE

3

abcde

1.3

Interfejs CharSequence

Interfejs CharSequence reprezentuje sekwencje znaków, które mogą być odczytywane. Jest on implemento-

wany przez klasy: CharBuffer, Segment, String, StringBuffer, StringBuilder. Zawiera on następujące metody:

1

char

charAt(

int

index)

2

int

length()

3

CharSequence subSequence(

int

start,

int

end)

4

String toString()

1.4

Klasa StringBuffer

Obiekty klasy String reprezentują niemodyfikowalne teksty, natomiast obiekty klasy StringBuilder mogą

zmieniać swoją długość oraz zawartość. Wybrane metody z klasy StringBuffer:

• metody służące do dołączania do sekwencji znaków:

1

public

StringBuffer append(

boolean

b)

2

public

StringBuffer append(

char

c)

3

public

StringBuffer append(

char

[] str)

4

public

StringBuffer append(

char

[] str,

int

offset,

int

len)

5

public

StringBuffer append(CharSequence s)

6

public

StringBuffer append(CharSequence s,

int

start,

int

end)

7

public

StringBuffer append(

double

d)

8

public

StringBuffer append(

float

f)

9

public

StringBuffer append(

int

i)

10

public

StringBuffer append(

long

lng)

11

public

StringBuffer append(Object obj)

4

background image

12

public

StringBuffer append(String str)

13

public

StringBuffer append(StringBuffer sb)

14

public

StringBuffer appendCodePoint(

int

codePoint)

• metody służące do umieszczania wewnątrz sekwencji znaków:

1

public

StringBuffer insert(

int

offset,

boolean

b)

2

public

StringBuffer insert(

int

offset,

boolean

b)

3

public

StringBuffer insert(

int

offset,

boolean

b)

4

public

StringBuffer insert(

int

index,

char

[] str,

int

offset,

int

len)

5

public

StringBuffer insert(

int

dstOffset, CharSequence s)

6

public

StringBuffer insert(

int

dstOffset, CharSequence s)

7

public

StringBuffer insert(

int

dstOffset, CharSequence s)

8

public

StringBuffer insert(

int

offset,

float

f)

9

public

StringBuffer insert(

int

offset,

int

i)

10

public

StringBuffer insert(

int

offset,

long

l)

11

public

StringBuffer insert(

int

offset, Object obj)

12

public

StringBuffer insert(

int

offset, String str)

• metody wyszukujące pojawienie się pierwszego (lub ostatniego) wystąpienia poszukiwanego podtekstu:

1

public int

indexOf(

int

ch)

2

public int

indexOf(String str)

3

public int

lastIndexOf(

int

ch)

4

public int

lastIndexOf(String str)

5

public int

indexOf(

int

ch,

int

fromIndex)

6

public int

indexOf(String str,

int

fromIndex)

7

public int

lastIndexOf(

int

ch,

int

fromIndex)

8

public int

lastIndexOf(String str,

int

fromIndex)

• metoda zwracająca długość:

1

public int

length()

• metody służące do pobierania fragmentu w postaci tekstu lub sekwencji znaków:

1

public

String substring(

int

start)

2

public

String substring(

int

start,

int

end)

3

public

CharSequence subSequence(

int

start,

int

end)

• metoda zwracająca aktualną pojemność:

1

public int

capacity()

• metody zwracają znak (charAt() zwraca char) lub punkt kodowy Unicode (codePointAt() zwraca int)

spod podanego indeksu:

1

public char

charAt(

int

index)

2

public int

codePointAt(

int

index)

• metody kasujące znak lub znaki w sekwencji znaków:

1

public

StringBuffer delete(

int

start,

int

end)

2

public

StringBuffer deleteCharAt(

int

index)

5

background image

• metoda ustawiająca minimalną pojemność:

1

public void

ensureCapacity(

int

minimumCapacity)

• metody pozwalające pobrać część sekwencji znaków jako tablicę znaków:

1

public

String substring(

int

start)

2

public

String substring(

int

start,

int

end)

• metody pozwalające pobrać sekwencję znaków jako tekst:

1

public

String toString()

• metoda zamieniająca znaki:

1

public

StringBuffer replace(

int

start,

int

end, String str)

• metoda odwracająca kolejność wszystkich znaków w sekwencji znaków:

1

public

StringBuffer reverse()

• metoda ustawiająca długość sekwencji znaków:

1

public void

setLength(

int

newLength)

• metoda ustawiająca znak pod podanym indeksem w sekwencji znaków:

1

public void

setCharAt(

int

index,

char

ch)

• metoda, która ma za zadnie spróbować zmniejszyć ilości wykorzystywanej pamięci :

1

public void

trimToSize()

1.5

Klasa StringBuilder

Klasa kompatybilna z klasą StringBuffer, ale w przeciwieństwie do niej nie jest synchronizowana. Dzięki

temu uzyskuje ona zwiększoną wydajność, jednakże jej obiekty nie mogą być wykorzystane jednocześnie przez
wiele wątków.

1

public class

Test {

2

public static void

main(String[] args) {

3

String s =

"***"

;

4

s +=

"###"

;

5

}

6

}

javap -c Test

1

public static void

main(java.lang.String[]);

2

Code:

3

0: ldc #16

// String ***

4

2: astore_1

5

3:

new

#18

// class java/lang/StringBuilder

6

6: dup

6

background image

7

7: aload_1

8

8: invokestatic #20

// Method java/lang/String.valueOf:(Ljava/lang/Object;)Ljava/lang/String;

9

11: invokespecial #26

// Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V

10

14: ldc #29

// String ###

11

16: invokevirtual #31

// Method ←֓

java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;

12

19: invokevirtual #35

// Method java/lang/StringBuilder.toString:()Ljava/lang/String;

13

22: astore_1

14

23:

return

15

}

1.6

Wyświetlanie i wczytywanie tekstów

Teksty mogą być wyświetlane na konsolę przy użyciu standardowego strumienia wyjściowego – System.out

oraz standardowego strumienia błędów – System.err.

Teksty mogą być wczytywane z konsoli przy użyciu standardowego strumienia wejściowego lub poprzez

klasę Scanner

3

.

1.7

Formatowanie tekstów

Formatowanie tekstów

4

:

-

b

,

B

– jeżeli argument ma wartość null to wynikiem jest ”f alse”, jeżeli jako argument została przeka-

zana zmienna boolean lub Boolean to wynikiem jest tekst zwrócony przez String.valueOf (), w innym
przypadku wynikiem jest ”true”,

-

h

,

H

– jeżeli argument ma wartość null to wynikiem jest ”null”, w innym przypadku jest to wynik

wywołania Integer.toHexString(arg.hashCode()),

-

s

,

S

– jeżeli argument ma wartość null to wynikiem jest ”null”, jeżeli argument implementuje

F ormattable, to dla argumentu wywoływana jest metoda f ormatT o, w innym przypadku wynikiem
jest tekst zwrócony przez arg.toString(),

-

c

,

C

– znak Unicode (*),

-

d

– liczba w formacie dziesiętnym (**),

-

o

– liczba w formacie ósemkowym (**),

-

x

,

X

– liczba w formacie szesnastkowym (**),

-

e

,

E

– liczba dziesiętna w zapisie naukowym (***),

-

f

– liczba dziesiętna (***),

-

n

– zależny od platformy znak nowej linii.

Oznaczenia:

* dotyczy char, Character, byte, Byte, short, Short oraz int and Integer pod warunkiem, że metoda

Character.isV alidCodeP oint(int) zwraca true,

** dotyczy byte, Byte, short, Short, int, Integer, long, Long oraz BigInteger,

*** dotyczy f loat, F loat, double, Double oraz BigDecimal.

3

http://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html

4

http://docs.oracle.com/javase/7/docs/api/java/util/Formatter.html#syntax

7

background image

1

package

pl.kielce.tu.lab8;

2
3

public class

Formats {

4
5

public static void

main(String[] args) {

6

int

x = 123;

7

String s = String.format(

"dec %d %n"

, x);

8

s += String.format(

"oct %o %n"

, x);

9

s += String.format(

"hex %x %n"

, x);

10

System.out.print(s);

11
12

System.out.printf(

"dec %4d %n"

, x);

13

System.out.printf(

"oct %8o %n"

, x);

14

System.out.printf(

"hex %12x %n"

, x);

15

}

16

}

Przykład 3: src/pl/kielce/tu/lab8/Formats.java {link}

Szczegóły dotyczące formatowania można znaleźć:

http://download.oracle.com/javase/7/docs/api/java/util/Formatter.html

1.8

Wyrażenia regularne

Klasy znaków:

[abc] – a, b, lub c,
[∧abc] – wszystkie znaki poza a, b oraz c,
[a − cA − c] – znaki od a do c oraz od A do C,
[a − k&&[i − z]] – i, j oraz k (część wspólna).

Predefiniowane klasy znaków:

. (kropka) – dowolny znak,
\d – cyfra [0 9],
\D – inny znak poza cyfrą [0 9],
\s – biały znak [\t\n\x0B\f \r],
\S – inny znak poza białym znakiem [∧\s],
\w – litera mała, duża lub cyfra [a − zA − Z0 9],
\W – inny znak poza literą mała, dużą lub cyfrą [∧\w],
W zmiennych typu String symbol \ musi zostać zastąpiony przez \\.

Znaki dotyczące zakotwiczenia:

– początek linii,
\$ – koniec linii,
\b – granica słowa,
\B – przeciwieństwo granicy słowa.

Zachłanny kwantyfikator (ang. greedy) – dopasowuje maksymalny, możliwy fragment ciągu do wzorca.
Niechętny kwantyfikator (ang. reluctant) – dopasowuje minimalny, konieczny fragment ciągu do wzorca.
W tabeli podana jest liczba wystąpień X.

Zachłanny

Niechętny

Raz lub wcale

X?

X??

Zero lub więcej razy

X*

X*?

Raz lub więcej razy

X+

X+?

Dokładnie n razy

X{n}

X{n}?

Co najmniej n razy

X{n,}

X{n,}?

Co najmniej n razy, ale nie więcej niż m razy

X{n,m}

X{n,m}?

8

background image

W przykładzie poniżej pokazany został sposób sprawdzenia czy wprowadzony tekst jest zgodny z podanym

wyrażeniem regularnym:

1

package

pl.kielce.tu.lab8;

2
3

import

java.util.regex.Matcher;

4

import

java.util.regex.Pattern;

5
6

public class

Regs {

7
8

public static void

main(String[] args) {

9

Pattern p = Pattern.compile(

"\\d{2}-\\d{3}"

);

10

String s =

"25-900"

;

11

Matcher m = p.matcher(s);

12

System.out.println(

"Pattern ("

+ p +

" matches "

+ s +

": "

+ m.matches());

13

}

14

}

Przykład 4: src/pl/kielce/tu/lab8/Regs.java {link}

Szczegóły dotyczące wyrażeń regularnych można znaleźć:

http://download.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html
http://docs.oracle.com/javase/7/docs/api/java/util/regex/Matcher.html

Nawiasy półokrągłe mogą zostać wykorzystane do tworzenia grup, do których można się później odwoływać

poprzez $1, $2, itd.

1

private static

String html =

""

+

2

"<hhml>"

+ nl +

3

"<head>"

+ nl +

4

"</head>"

+ nl +

5

"<body>"

+ nl +

6

"<h1> Heading 1</h1>"

+ nl +

7

"<h2> Heading 2</h2>"

+ nl +

8

"<h3> Heading 3</h3>"

+ nl +

9

"<h4> Heading 4</h4>"

+ nl +

10

"<h5> Heading 5</h5>"

+ nl +

11

"<h6> Heading 6</h6>"

+ nl +

12

"</body>"

+ nl +

13

"</html>"

;

14
15

public static void

main(String[] args) {

16

System.out.println(html);

17

System.out.println();

18
19

System.out.println(html.replace(

"<h"

,

"<br><h"

));

20

System.out.println();

21
22

Pattern p = Pattern.compile(

"(<h)(\\d)"

);

23

Matcher m = p.matcher(html);

24

System.out.println(m.replaceAll(

"<br><h"

));

25

System.out.println();

26

System.out.println(m.replaceAll(

"<br>$1$2"

));

27

}

28

}

Przykład 5: src/pl/kielce/tu/lab8/TestRegexMatch.java {link}

2

Tablice

2.1

Inicjalizacja

9

background image

1

public class

TabInit {

2

public static void

main(String[] args) {

3

Integer[] t1 = {

new

Integer(10),

new

Integer(11) };

4

Integer[] t2;

5

// t2 = { new Integer(20), new Integer(21) };

6

// Error: Array constants can only be used in initializers

7

Integer[] t3;

8

t3 =

new

Integer[] {

new

Integer(30),

new

Integer(31) };

9

Integer[] t4 =

new

Integer[4];

10

for

(

int

i = 0; i < t4.length; i++)

11

t4[i] =

new

Integer(40 + i);

12
13

Integer[][] tt1 =

new

Integer[2][];

14

tt1[0] =

new

Integer[] { 1, 2, 3 };

15

tt1[1] =

new

Integer[] { 7 };

16
17

Integer[][] tt2 =

new

Integer[2][2];

18

Integer tt3[][] = { {}, {}, {}, };

19
20

Integer[] tt4[] = { { 1 }, { 2, 3 }, { 4, 5, 6 }, };

21

}

22

}

Przykład 6: src/pl/kielce/tu/lab8/TabInit.java {link}

2.2

Długość tablicy

1

public class

TabLength {

2

public static void

main(String[] args) {

3

Integer[] t1 = {

new

Integer(10),

new

Integer(11) };

4

System.out.println(

"t1.length = "

+ t1.length);

5

Integer[] t2;

6

// System.out.println("t2.length = " + t2.length);

7

// The local variable t2 may not have been initalized

8

Integer[] t3;

9

t3 =

new

Integer[] {

new

Integer(30),

new

Integer(31) };

10

System.out.println(

"t3.length = "

+ t3.length);

11

Integer[] t4 =

new

Integer[4];

12

for

(

int

i = 0; i < 2; i++)

13

t4[i] =

new

Integer(40 + i);

14

System.out.println(

"t4.length = "

+ t4.length);

15

}

16

}

Przykład 7: src/pl/kielce/tu/lab8/TabLength.java {link}

2.3

Wyświetlanie

Klasa java.util.Arrays posiada przeciążone metody toString(), które wykorzystują metodę toString()

zdefiniowaną w klasie, której obiekty znajdują się w tablicy. Dla tablic wielowymiarowych jest to metoda
deepT oString(). http : //download.oracle.com/javase/7/docs/api/java/util/Arrays.html {link}:

1

public class

TabPrint {

2

static class

MyClass {

3

int

i;

4
5

MyClass(

int

i) {

6

this

.i = i;

10

background image

7

}

8
9

@Override

10

public

String toString() {

11

return

"MyClass"

+ i +

" "

;

12

}

13

}

14
15

public static void

main(String[] args) {

16

MyClass[] m = {

new

MyClass(5),

new

MyClass(1),

new

MyClass(9),

new

MyClass(4) };

17

System.out.println(

"Arrays.toString(m) = "

+ Arrays.toString(m));

18

MyClass[][] m2 = { {

new

MyClass(5) }, {

new

MyClass(1),

new

MyClass(9) }, {

new

←֓

MyClass(4) } };

19

System.out.println(Arrays.deepToString(m2));

20

}

21

}

Przykład 8: src/pl/kielce/tu/lab8/TabPrint.java {link}

2.4

Wypełnianie

Klasa java.util.Arrays posiada przeciążone metody f ill() pozwalające wypełniać tablicę podaną warto-

ścią.

1

import

java.util.Arrays;

2
3

public class

TabFill {

4

public static void

main(String[] args) {

5

Integer[] f1 = { 1, 2, 3 };

6

System.out.println(Arrays.toString(f1));

7

Arrays.fill(f1, 7);

8

System.out.println(Arrays.toString(f1));

9

}

10

}

Przykład 9: src/pl/kielce/tu/lab8/TabFill.java {link}

2.5

Zwracanie tablic

1

public class

TabReturn {

2

static

Object[] returnTable() {

3

Object[] o =

null

;

4

Random r =

new

Random();

5

int

t = r.nextInt(4);

6

switch

(t) {

7

case

0:

8

o =

new

Long[r.nextInt(20)];

9

for

(

int

i = 0; i < o.length; i++)

10

o[i] = r.nextLong();

11

break

;

12

case

1:

13

o =

new

Integer[r.nextInt(20)];

14

for

(

int

i = 0; i < o.length; i++)

15

o[i] = r.nextInt();

16

break

;

17

case

2:

18

o =

new

Double[r.nextInt(20)];

19

for

(

int

i = 0; i < o.length; i++)

20

o[i] = r.nextDouble();

11

background image

21

break

;

22

case

3:

23

o =

new

Float[r.nextInt(20)];

24

for

(

int

i = 0; i < o.length; i++)

25

o[i] = r.nextFloat();

26

break

;

27

}

28

return

o;

29

}

30
31

public static void

main(String[] args) {

32

Object[] o = returnTable();

33

System.out.println(

"Class : "

+ o.getClass().getName());

34

System.out.println(

"Length : "

+ o.length);

35

System.out.println(

"Values : "

+ Arrays.toString(o));

36

}

37

}

Przykład 10: src/pl/kielce/tu/lab8/TabReturn.java {link}

2.6

Kopiowanie

W klasie java.lang.System zdefiniowano metodę o nazwie: arraycopy().
http : //download.oracle.com/javase/7/docs/api/java/lang/System.html {link}
W klasie java.util.Arrays zdefiniowano przeciążone metody o nazwach: copyOf () oraz copyOf Range().

1

public class

TabCopy {

2

public static void

main(String[] args) {

3

Integer[] t1 = {

new

Integer(10),

new

Integer(11) };

4

Integer[] t2 = {

new

Integer(20),

new

Integer(21) };

5

Integer[] t3 = {

new

Integer(30),

new

Integer(31) };

6
7

System.out.println(

"Przed t1[] = "

+ Arrays.toString(t1));

8

System.out.println(

"Przed t2[] = "

+ Arrays.toString(t2));

9

System.out.println(

"Przed t3[] = "

+ Arrays.toString(t3));

10
11

System.arraycopy(t2, 0, t1, 1, 1);

12

System.out.println(

"Po t1[] = "

+ Arrays.toString(t1));

13

System.out.println(

"Po t2[] = "

+ Arrays.toString(t2));

14
15

Integer[] t31 = Arrays.copyOf(t3, 1);

16

Integer[] t32 = Arrays.copyOfRange(t3, 1, 2);

17

System.out.println(

"Po t3[] = "

+ Arrays.toString(t3));

18

System.out.println(

"Po t31[]= "

+ Arrays.toString(t31));

19

System.out.println(

"Po t32[]= "

+ Arrays.toString(t32));

20

}

21

}

Przykład 11: src/pl/kielce/tu/lab8/TabCopy.java {link}

2.7

Porównywanie

Klasa java.util.Arrays posiada przeciążone metody equals(), które wykorzystują metodę equals() zdefi-

niowaną w klasie, której obiekty znajdują się w tablicy. W przykładzie poniżej w klasie M yClass nie została
przesłonięta metoda equals() dlatego wynikiem porównania jest f alse. Do porównywania tablic wielowymia-
rowych służy metoda deepEquals().

1

public class

TabCompare {

2

static class

MyClass {

3

int

i;

12

background image

4
5

MyClass(

int

i) {

6

this

.i = i;

7

}

8
9

@Override

10

public

String toString() {

11

return

"MyClass"

+ i +

" "

;

12

}

13

}

14
15

public static void

main(String[] args) {

16

MyClass[] m1 = {

new

MyClass(5),

new

MyClass(1),

new

MyClass(9),

new

MyClass(4) };

17

MyClass[] m2 = {

new

MyClass(5),

new

MyClass(1),

new

MyClass(9),

new

MyClass(4) };

18

Arrays.equals(m1, m2);

19

System.out.println(

"Arrays.equals(m1, m2) = "

+ Arrays.equals(m1, m2));

20
21

MyClass[][] mm1 = { {

new

MyClass(5) }, {

new

MyClass(1),

new

MyClass(9) }, {

new

←֓

MyClass(4) } };

22

MyClass[][] mm2 = { {

new

MyClass(5) }, {

new

MyClass(1),

new

MyClass(9) }, {

new

←֓

MyClass(4) } };

23

Arrays.equals(mm1, mm2);

24

System.out.println(

"Arrays.equals(mm1, mm2) = "

+ Arrays.equals(mm1, mm2));

25

System.out.println(

"Arrays.deepEquals(mm1, mm2) = "

+ Arrays.deepEquals(mm1, mm2));

26

}

27

}

Przykład 12: src/pl/kielce/tu/lab8/TabCompare.java {link}

W przykładzie poniżej w klasie M yClass metoda equals() zwraca true jeżeli porównywany obiekt jest

takiej samej klasy jak aktualny obiekt (wynik porównania this.getClass().isInstance(o) jest równy true) oraz
wartość pola i w aktualnym obiekcie i porównywanym jest taka sama (wynik porównania this.i == tmp.i
jest równy true).

1

public class

TabCompare2 {

2

static class

MyClass {

3

int

i;

4
5

MyClass(

int

i) {

6

this

.i = i;

7

}

8
9

@Override

10

public

String toString() {

11

return

"MyClass"

+ i +

" "

;

12

}

13
14

@Override

15

public boolean

equals(Object o) {

16

if

(

this

.getClass().isInstance(o) ==

false

)

17

return false

;

18

MyClass tmp = (MyClass) o;

19

return this

.i == tmp.i;

20

}

21

}

22
23

public static void

main(String[] args) {

24

MyClass[] m1 = {

new

MyClass(5),

new

MyClass(1),

new

MyClass(9),

new

MyClass(4) };

25

MyClass[] m2 = {

new

MyClass(5),

new

MyClass(1),

new

MyClass(9),

new

MyClass(4) };

26

Arrays.equals(m1, m2);

27

System.out.println(

"Arrays.equals(m1, m2) = "

+ Arrays.equals(m1, m2));

28

13

background image

29

MyClass[][] mm1 = { {

new

MyClass(5) }, {

new

MyClass(1),

new

MyClass(9) }, {

new

←֓

MyClass(4) } };

30

MyClass[][] mm2 = { {

new

MyClass(5) }, {

new

MyClass(1),

new

MyClass(9) }, {

new

←֓

MyClass(4) } };

31

Arrays.equals(mm1, mm2);

32

System.out.println(

"Arrays.equals(mm1, mm2) = "

+ Arrays.equals(mm1, mm2));

33

System.out.println(

"Arrays.deepEquals(mm1, mm2) = "

+ Arrays.deepEquals(mm1, mm2));

34

}

35

}

Przykład 13: src/pl/kielce/tu/lab8/TabCompare2.java {link}

2.8

Sortowanie

Klasa java.util.Arrays posiada przeciążone metody sort(). Przykład poniżej powoduje zgłoszenie wyjątku

java.lang.ClassCastException : M yClass cannot be cast to java.lang.Comparable. Problem ten może
zostać rozwiązany na co najmniej dwa sposoby poprzez implementacje interfejsów: java.lang.Comparable
lub java.util.Comparator.

1

public class

TabSort {

2

static class

MyClass {

3

int

i;

4
5

MyClass(

int

i) {

6

this

.i = i;

7

}

8
9

@Override

10

public

String toString() {

11

return

"MyClass"

+ i +

" "

;

12

}

13

}

14
15

public static void

main(String[] args) {

16

MyClass[] m = {

new

MyClass(5),

new

MyClass(1),

new

MyClass(9),

new

MyClass(4) };

17

// java.lang.ClassCastException: MyClass cannot be cast to java.lang.Comparable

18

Arrays.sort(m);

19

System.out.println(Arrays.toString(m));

20

}

21

}

Przykład 14: src/pl/kielce/tu/lab8/TabSort.java {link}

Interfejs java.lang.Comparable<T> wykorzystywany jest podczas ustalania porządku obiektów. Dla Javy

w wersji ­ 1.5 posiada następującą metodę:

1

int

compareTo(T o)

Musi ona spełniać następujące warunki:

• dla każdego x oraz y spełnione musi być:

sgn(x.compareTo(y)) == -sgn(y.compareTo(x))

• spełniona musi być zasada przechodniości:

jeżeli (x.compareTo(y)>0 && y.compareTo(z)>0) to x.compareTo(z)>0

• dla każdego z spełnione musi być:

14

background image

jeżeli x.compareTo(y)==0 to sgn(x.compareTo(z)) == sgn(y.compareTo(z))

• zalecane jest spełnienie warunku:

(x.compareTo(y)==0) == (x.equals(y))

Rozwiązanie 1. Implementacja interfejsu java.lang.Comparable.

1

public class

TabSort2 {

2

static class

MyClass

implements

Comparable<MyClass> {

3

int

i;

4
5

MyClass(

int

i) {

6

this

.i = i;

7

}

8
9

@Override

10

public

String toString() {

11

return

"MyClass"

+ i +

" "

;

12

}

13
14

@Override

15

public int

compareTo(MyClass o) {

16

return this

.i - o.i;

// !!!

17

}

18

}

19
20

public static void

main(String[] args) {

21

MyClass[] m = {

new

MyClass(5),

new

MyClass(1),

new

MyClass(9),

new

MyClass(4) };

22

Arrays.sort(m);

23

System.out.println(Arrays.toString(m));

24

}

25

}

Przykład 15: src/pl/kielce/tu/lab8/TabSort2.java {link}

Interfejs java.lang.Comparator<T> wykorzystywany jest podczas ustalania porządku obiektów. Dla Javy

w wersji ­ 1.5 posiada następujące metody:

1

int

compare(T o1, T o2)

2

boolean

equals(Object obj)

Metoda int compare(T o1, T o2) musi spełniać następujące warunki:

• dla każdego x oraz y spełnione musi być:

sgn(compare(x, y)) == -sgn(compare(y, x))

• spełniona musi być zasada przechodniości:

jeżeli ((compare(x, y)>0) && (compare(y, z)>0)) to compare(x, z)>0

• dla każdego z spełnione musi być:

jeżeli compare(x, y)==0 tosgn(compare(x, z))==sgn(compare(y, z))

• zalecane jest spełnienie warunku:

15

background image

compare(x, y)==0) == (x.equals(y))

Metoda equals(Object obj) musi spełniać takie same wytyczne jak metoda Object.equals(Object). Dodat-

kowo może zwrócić tylko true jeżeli porównywany obiekt jest także Comparator oraz wykorzystuje ten sam
sposób ustalania porządku co this. Dla każdego o1 oraz o2 spełnione musi być:

jeżeli comp1.equals(comp2) to sgn(comp1.compare(o1, o2))==sgn(comp2.compare(o1, o2))

Nie ma konieczności przesłaniania tej metody ponieważ zawsze bezpiecznie można wykorzystać metodę Ob-
ject.equals(Object).

1

@Override

2

public boolean

equals(Object obj){

3

return

(obj

instanceof

MyComparator);

4

}

Rozwiązanie 2. Wykorzystanie implementacji interfejsu java.util.Comparator.

1

public class

TabSort3 {

2

static class

MyClass {

3

int

i;

4
5

MyClass(

int

i) {

6

this

.i = i;

7

}

8
9

@Override

10

public

String toString() {

11

return

"MyClass"

+ i +

" "

;

12

}

13

}

14
15

static class

MyComparator

implements

Comparator<MyClass> {

16

@Override

17

public int

compare(MyClass o1, MyClass o2) {

18

return

o1.i - o2.i;

// !!!

19

}

20

}

21
22

public static void

main(String[] args) {

23

MyClass[] m = {

new

MyClass(5),

new

MyClass(1),

new

MyClass(9),

new

MyClass(4) };

24

Arrays.sort(m,

new

MyComparator());

25

System.out.println(Arrays.toString(m));

26

}

27

}

Przykład 16: src/pl/kielce/tu/lab8/TabSort3.java {link}

2.9

Przeszukiwanie tablicy posortowanej

Klasa java.util.Arrays posiada przeciążone metody binarySearch() pozwalające przeszukiwać uporząd-

kowaną tablicę.

1

public class

TabSearch {

2

static class

MyClass

implements

Comparable<MyClass> {

3

int

i;

4
5

MyClass(

int

i) {

6

this

.i = i;

16

background image

7

}

8
9

@Override

10

public

String toString() {

11

return

"MyClass"

+ i +

" "

;

12

}

13
14

@Override

15

public int

compareTo(MyClass o) {

16

return this

.i - o.i;

// !!!

17

}

18
19

@Override

20

public boolean

equals(Object o) {

21

if

(

this

.getClass().isInstance(o) ==

false

)

22

return false

;

23

MyClass tmp = (MyClass) o;

24

return this

.i == tmp.i;

25

}

26

}

27
28

public static void

main(String[] args) {

29

MyClass[] m = {

new

MyClass(5),

new

MyClass(1),

new

MyClass(9),

new

MyClass(4) };

30

System.out.println(

"MyClass[] = "

+ Arrays.toString(m));

31

System.out.println(

"Index = "

+ Arrays.binarySearch(m,

new

MyClass(4)));

32
33

Arrays.sort(m);

34

System.out.println(

"MyClass[] = "

+ Arrays.toString(m));

35

System.out.println(

"Index = "

+ Arrays.binarySearch(m,

new

MyClass(4)));

36

}

37

}

Przykład 17: src/pl/kielce/tu/lab8/TabSearch.java {link}

3

Przykładowa treść laboratorium

1. Proszę stworzyć edytor tekstu działający w trybie tekstowym. W danej chwili program powinien po-

zwalać na przetwarzanie tylko jednej wybranej przez użytkownika linii. Wszystkie linie powinny być
ponumerowane. Po uruchomieniu aplikacji powinna pojawić się lista dostępnych operacji, takich jak:
dodanie pustej linii, skasowanie linii, dopisanie tekstu na końcu linii, wyszukanie i zastępowanie tekstu
poprzez proste dopasowanie oraz wyrażenia regularne, konwersja wielkości liter, zliczanie linii, wyrazów,
znaków, itp.

2. Proszę stworzyć aplikację, która:

– stworzy i zainicjuje kilkoma sposobami tablice jednowymiarowe zawierającą referencje do obiektów

klasy stworzonej przez użytkownika (np. klasy Osoba; Uwaga: tablice tekstów, typów prostych,
typów opakowujących, itp. nie będą oceniane), wyświetli zawartość tablicy, skopiuje fragment
tablicy, porówna tablice, posortuje tablicę, przeszuka tablicę posortowaną, itp.,

– stworzy i zainicjuje tablice dwuwymiarowe zawierającą referencje do obiektów klasy stworzonej

przez użytkownika, wyświetli zawartość tablicy, porówna tablice, itp.

Literatura

[1] Schildt Herbert, Java. Kompendium programisty. Wydanie VIII, Helion, 2012

[2] Eckel Bruce, Thinking in Java, Edycja polska, Wydanie IV, Helion, 2006

[3] Horstmann Cay S., Cornell Gary, Java. Podstawy, Wydanie VIII, Helion, 2008

17

background image

[4] Horstmann Cay S., Cornell Gary, Java. Techniki zaawansowane, Wydanie VIII, Helion, 2009

[5] Bloch Joshua, Java. Efektywne programowanie. Wydanie II, Helion, 2009

[6] Brackeen David, Barker Bret, Vanhelsuwe Laurence, Java. Tworzenie gier, Helion, 2004

[7] Słownik terminów z zakresu obiektowości. Kazimierz Subieta, Akademicka Oficyna Wydawnicza PLJ,

Warszawa 1999

[8] Sedgewick Robert, Wayne Kevin, Algorytmy. Wydanie IV, Helion, 2012

Materiały

do

przedmiotu

dostępne

na

stronach:

http://achilles.tu.kielce.pl/

http://weaii-

moodle.tu.kielce.pl/

18


Document Outline


Wyszukiwarka

Podobne podstrony:
notatki java 08
JAVA 06 Nieznany
Java 08 Typy uogolnione Kolekcje Strumienie Bazy danych
facade (fasada) [java wzorce p Nieznany
JAVA 10 Nieznany
JAVA 09 Nieznany
podstawy programowania java id Nieznany
Biologia zapylania roslin X 08 Nieznany (2)
FW13 fale elektromagnetyczne 08 Nieznany
notatki java 08
java 08
java 08
Analiza ekon 08 w2 id 60028 Nieznany
ei 2005 07 08 s085 id 154185 Nieznany
2015 04 09 08 25 05 01id 28644 Nieznany (2)
08 2HBZ25RJBN6D4ITZUMZK4SZDSTJD Nieznany
chemia lato 12 07 08 id 112433 Nieznany
Literaturoznawstwo (08 04 2013) Nieznany

więcej podobnych podstron