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
• 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
• 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
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
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
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
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
• 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
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
1.7
Formatowanie tekstów
Formatowanie tekstów
-
′
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
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
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
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
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
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
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
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
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
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
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
[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
są
na
stronach:
http://achilles.tu.kielce.pl/
http://weaii-
moodle.tu.kielce.pl/
18