- Metody
- Generowanie losowego ciągu
- Porównanie ciągów:
equals()
lub ==
?
Klasa jest
String
bardzo często wykorzystywana przez programistów, dlatego należy się jej bardzo dobrze nauczyć.
Pamiętaj, że obiekty klas
String
są niezmienne. Więc jeśli myślisz, że zmieniasz ciąg, w rzeczywistości tworzysz nowy ciąg. Java ma specjalne klasy
StringBuffer
,
StringBuilder
które pozwalają na zmiany w ciągu. Klasy
String
,
StringBuffer
,
StringBuilder
są zdefiniowane w pakiecie
java.lang i są dostępne automatycznie, bez deklaracji importu. Wszystkie trzy klasy implementują interfejs
CharSequence
. Tworzenie ciągu jest bardzo proste. Możesz na przykład to zrobić:
String aboutCat = "Кот - это звучит гордо, а если наступить на хвост, то громко";
Możesz utworzyć tablicę ciągów:
String[] cats = {"Васька", "Barsik", "Murzik"};
Możesz utworzyć pusty obiekt klasy
String
:
String str = new String();
Możesz utworzyć ciąg znaków za pomocą tablicy znaków:
char[] chars = { 'c', 'a', 't' };
String str = new String(chars);
Istnieje również konstruktor, który pozwala ustawić zakres tablicy znaków. Musisz określić początek zakresu i liczbę znaków, których chcesz użyć:
char[] chars = {'c', 'a', 't', 'a', 'm', 'a', 'r', 'a', 'n' };
String str = new String(chars, 0, 3);
Możesz utworzyć obiekt klasy
String
z obiektu klas,
StringBuffer
używając
StringBuilder
następujących konstruktorów:
String(StringBuffer obiekt_StrBuf)
String(StringBuilder obiekt_StrBuild)
Operatory +
i += dlaString
W Javie znak plus (
+
) oznacza łączenie ciągów, innymi słowy łączenie ciągów.
String cat = "Кот";
String name = "Васька";
String fullname = cat + " " + name;
Jeśli jeden z operandów w wyrażeniu zawiera ciąg znaków, wówczas pozostałe operandy również muszą być ciągami. Dlatego sama Java może rzutować zmienne na reprezentację łańcuchową, nawet jeśli nie są one ciągami.
int digit = 4;
String paws = " лапы";
String aboutcat = digit + paws;
За кулисами Java за нас преобразовало число 4 в строку "4"
Formatowanie ciągów
Załóżmy, że mamy zasób typu string:
<string name="aboutcat">У кота по имени Барсик четыре лапы, один хвост. Ему 5 лет</string>
Aby programowo wyświetlić ten ciąg w elemencie
TextView
, możesz użyć kodu:
TextView tvCatsInfo = (TextView)findViewById(R.id.textView1);
tvCatsInfo.setText(R.string.aboutcat);
Wyobraź sobie, że masz kilka kotów. Możesz oczywiście mieć własną linię dla każdego kota. Ale linie są bardzo podobne, zmieniają się tylko imiona i wiek. Możesz także zmienić liczbę łap i ogonów (co palisz?). W takich przypadkach można zastosować formatowanie ciągu. Musimy określić słowa, które zmienimy i zastąpić je specjalnym zestawem znaków zaczynającym się od symbolu procentu, następnie liczby zwiększającej się o jeden, a następnie
$s
ciągów znaków lub
$d
liczb. Zmieńmy więc nasz zasób ciągu znaków w następujący sposób:
<string name="aboutcat">У кота по имени %1$s %2$s лапы, %3$s хвост. Ему %4$d лет</string>
Wprowadźmy zmiany w kodzie:
String strBarsik = "Barsik";
String strPaws = "четыре";
String strTail = "jeden";
int year = 5;
String strCats = getResources().getString(R.string.aboutcat);
String strFinal = String.format(strCats, strBarsik, strPaws, strTail, year);
tvCatsInfo.setText(strFinal);
Jeśli masz kota Vaskę i ma on sześć lat, dodaj dwie zmienne i sformatuj linię
String strVaska = "Васька";
year = 6;
String strFinal = String.format(strCats, strVaska, strPaws, strTail, year);
tvCatsInfo.setText(strFinal);
Oto prosty przykład formatowania. Pamiętaj o tym i używaj go we właściwych miejscach.
Zasób ciągu
Wskazane jest przechowywanie ciągów w zasobach. Programowy dostęp do zasobu ciągu odbywa się w następujący sposób:
String catName = getResources().getString(R.string.barsik);
Wyodrębnij ciągi z tablic ciągów w zasobach
Załóżmy, że masz zdefiniowaną tablicę ciągów w pliku
strings.xml o nazwie
cats_array
. Następnie możesz uzyskać dostęp do wierszy z takich zasobów:
Resources res = getResources();
String[] cats = res.getStringArray(R.array.cats_array);
Metody
public char charAt (int index)
Zwraca znak o określonym przesunięciu w tym ciągu. Odliczanie rozpoczyna się od 0. Nie ma potrzeby używania wartości ujemnych i nieistniejących, bądź poważniejszy. Aby wyodrębnić wiele znaków, użyj
getChars()
.
String testString = "Котёнок";
char myChar = testString.charAt(2);
tv.setText(Character.toString(myChar));
public int codePointAt(int index)
Zwraca znak Unicode o podanym indeksie
String testString = "Котёнок";
int myChar = testString.codePointAt(3);
tv.setText(String.valueOf(myChar));
public int codePointBefore(int index)
Zwraca znak Unicode poprzedzający podany indeks
String testString = "Котёнок";
int myChar = testString.codePointBefore(4);
tv.setText(String.valueOf(myChar));
public int codePointCount(int start, int end)
Oblicza liczbę znaków Unicode między pozycjami
start
i
end
String testString = "Котёнок";
int myChar = testString.codePointCount(0, 3);
tv.setText(String.valueOf(myChar));
public int compareTo(String string)
Porównuje określony ciąg znaków przy użyciu wartości znaków Unicode i oblicza, który ciąg jest mniejszy, równy lub większy od następnego. Można używać do sortowania. Sprawa jest brana pod uwagę. Jeśli ciągi są zgodne, zwracane jest 0, jeśli jest mniejsze od zera, wówczas ciąg wywołujący jest mniejszy niż ciąg
string
, jeśli jest większy od zera, wówczas ciąg wywołujący jest większy niż ciąg
string
. Słowa z wielkich liter są umieszczane nad słowami z małych liter.
String testString = "Котёнок";
if (testString.compareTo("котёнок") == 0) {
tvInfo.setText("Строки равны");
} else {
tvInfo.setText("Строки не равны. Возвращено"
+ testString.compareTo("котёнок"));
}
Posortujmy tablicę ciągów za pomocą sortowania bąbelkowego.
String[] poem = { "Мы", "везём", "с", "собой", "кота" };
for (int j = 0; j < poem.length; j++) {
for (int i = j + 1; i < poem.length; i++) {
if (poem[i].compareTo(poem[j]) < 0) {
String temp = poem[j];
poem[j] = poem[i];
poem[i] = temp;
}
}
System.out.println(poem[j]);
}
W rezultacie otrzymujemy:
Мы
везём
кота
с
собой
Jak widać,
zmiana miejsc terminów nie zmienia sumy sortującej kotów.
public int compareToIgnoreCase (String string)
Porównuje określony ciąg przy użyciu wartości znaków Unicode, bez uwzględniania wielkości liter.
String testString = "Котёнок";
if (testString.compareToIgnoreCase("котёнок") == 0) {
tv.setText("Строки равны");
} else {
tv.setText("Строки не равны. Возвращено"
+ testString.compareTo("котёнок"));
}
public String concat (String string)
Łączy ciąg z określonym ciągiem. Zwracany jest nowy ciąg zawierający połączenie dwóch ciągów. Zauważ, że sama nazwa metody zawiera kota!
String testString = "Сук";
String newString = testString.concat("кот");
tv.setText(newString);
Metoda pełni tę samą funkcję co operator
+
i może być zapisana
Сук + кот
. Ale prawdziwy kot zastosuje metodę „kota”.
public boolean contains (CharSequence cs)
Określa, czy ciąg zawiera sekwencję znaków
CharSequence
String testString = "котёнок";
if(testString.contains("кот")){
infoTextView.setText("В слове котёнок содержится слово кот!");
}
public static String copyValueOf (char[] data, int start, int length)
Tworzy nowy ciąg zawierający określone znaki z tablicy,
Data
zaczynając od pozycji
start
(numeracja liczona od zera) o
długości długość .
public static String copyValueOf(char[] data)
Tworzy nowy ciąg zawierający znaki z określonej tablicy. Zmiana tablicy po utworzeniu wiersza nie powoduje zmiany utworzonego wiersza.
public boolean endsWith(String suffix)
Sprawdza, czy ciąg kończy się na
suffix
.
String str1 = "Суккот";
if(str1.endsWith("кот"))
infoTextView.setText("Слово заканчивается на котике");
else
infoTextView.setText("Плохое слово. Нет смысла его использовать");
public boolean equals (Object string)
Porównuje określony obiekt i ciąg znaków i zwraca
wartość true , jeśli porównywane ciągi są równe, tj. zawiera te same znaki i w tej samej kolejności, w której uwzględniana jest wielkość liter.
String str1 = "Кот";
String str2 = "Кошка";
if(str1.equals(str2))
infoTextView.setText("Строки совпадают");
else
infoTextView.setText("Строки не совпадают");
Metody nie należy mylić z operatorem
==
, który porównuje dwie referencje do obiektów i sprawdza, czy odnoszą się one do tej samej instancji. Zobacz Porównanie ciągów:
equals()
lub
==
?
public boolean equalsIgnoreCase(String string)
Porównuje określony ciąg z ciągiem źródłowym bez uwzględniania wielkości liter i zwraca
wartość true , jeśli są one równe. Zakres AZ uważa się za równy zakresowi az.
String str1 = "Кот";
String str2 = "кот";
if(str1.equalsIgnoreCase(str2))
infoTextView.setText("Строки совпадают");
else
infoTextView.setText("Строки не совпадают");
public static String format(Locale locale, String format, Object... args)
Zwraca sformatowany ciąg znaków przy użyciu podanego formatu i argumentów zlokalizowanych w danym zakresie. Na przykład data lub godzina
String.format("%.2f", floatValue);
Przyklejamy dwa słowa, które pojawiają się w nowej linii. W takim przypadku drugie słowo jest wyświetlane wielkimi literami.
String str1 = "Кот";
String str2 = "васька";
String strResult = String.format("%s\n%S", str1, str2);
infoTextView.setText(strResult);
Zamień liczbę na system ósemkowy.
String str1 = "8";
int inInt = Integer.parseInt(str1);
String strResult = String.format("(Восьмеричное oznaczający): %o\n", inInt);
infoTextView.setText(strResult);
Analogicznie wyświetlamy w systemie szesnastkowym
String str1 = "255";
int inInt = Integer.parseInt(str1);
String strResult = String.format("(Шестнадцатеричное oznaczający): %x\n", inInt);
infoTextView.setText(strResult);
W przypadku użycia wielkich liter
%X
będzie
ff
to
FF
. Do stosowania systemu dziesiętnego
%d
. Datę można również wyświetlić na różne sposoby.
Date now = new Date();
Locale locale = Locale.getDefault();
infoTextView.setText(
String.format(locale, "%tD\n", now) +
String.format(locale, "%tF\n", now) +
String.format(locale, "%tr\n", now) +
String.format(locale, "%tz\n", now) +
String.format(locale, "%tZ\n", now));
public byte[] getBytes(String charsetName)
Zwraca sformatowany ciąg znaków przy użyciu podanego formatu.
public void getBytes(int start, int end, byte[] data, int index)
i inne przeciążenia Metoda przechowuje znaki w tablicy bajtów, co stanowi alternatywę dla metody
getChars()
. Często używane podczas eksportowania ciągów z różnych źródeł, które używają innych znaków Unicode. Na przykład Java domyślnie współpracuje z 16-bitowymi znakami Unicode, a w Internecie ciągi często używają 8-bitowego Unicode, ASCII itp.
public void getChars(int start, int end, char[] buffer, int index)
Metoda wyodrębniania wielu znaków z ciągu. Należy określić indeks początku podciągu (
start
), indeks znaku następującego po końcu podciągu, który ma zostać wyodrębniony ( end ). Tablica, która odbiera wybrane znaki, znajduje się w parametrze
bufora . Indeks w tablicy, od którego będzie zapisywany podciąg, przekazywany jest w parametrze
indeksu . Upewnij się, że tablica jest wystarczająco duża, aby pomieścić wszystkie znaki w określonym podciągu.
String unusualCat = "Котёнок по имени Гав";
int start = 5;
int end = 12;
char[] buf = new char[end - start];
unusualCat.getChars(start, end, buf, 0);
infoTextView.setText(new String(buf));
public int hashCode()
Zwraca liczbę całkowitą będącą kodem skrótu dla tego obiektu.
public int indexOf(int c)
Zwraca numer pierwszej napotkanej pozycji o określonym indeksie c.
String testString = "котёнок";
infoTextView.setText(String.valueOf(testString.indexOf("ё")));
public int indexOf (int c, int start)
Wyszukuje indeks od, zaczynając od pozycji
start
String testString = "котёнок";
infoTextView.setText(String.valueOf(testString.indexOf("ё", 4)));
public int indexOf (String string)
Wyszukuje ciąg znaków
subString
String testString = "У окошка";
infoTextView.setText(String.valueOf(testString.indexOf("кошка")));
public int indexOf (String subString, int start)
Wyszukuje ciąg znaków
subString
zaczynając od pozycji
start
String testString = "У окошка";
infoTextView.setText(String.valueOf(testString.indexOf("кошка", 2)));
public String intern ()
„Hashuje” ciąg znaków.
public boolean isEmpty ()
Sprawdza, czy ciąg znaków jest pusty
if(catname.isEmpty()) {
}
Metoda ta pojawiła się w API 9 (Android 2.1). W przypadku starszych urządzeń użyj.
String.length() == 0
public int lastIndexOf (String string) и другие перегруженные версии
Zwraca numer ostatniej napotkanej pozycji pod określonym indeksem. Na przykład możesz uzyskać nazwę pliku bez rozszerzenia w następujący sposób:
filename.toString().substring(0, filename.getString().lastIndexOf("."));
W tym przykładzie otrzymujemy pozycję ostatniego punktu i poprzedzający go podciąg.
public int length()
Zwraca długość ciągu
String testString = "котёнок";
infoTextView.setText(String.valueOf(testString.length()));
public boolean matches(String regularExpression)
Sprawdza, czy ciąg pasuje do wyrażeń regularnych.
public int offsetByCodePoints (int index, int codePointOffset)
Zwraca pozycję znajdującą się w odległości
codePointOffset
od pozycji początkowej określonej przez parametr.Metoda
index
public boolean regionMatches (int thisStart, String string, int start, int length)
porównuje określoną część ciągu z inną częścią ciągu. Należy określić indeks początku zakresu wierszy obiektu wywołującego klasę
String
. Łańcuch do porównania przekazywany jest w parametrze
string
. W parametrze podawany jest indeks znaku, od którego należy przeprowadzić porównanie
start
, a w parametrze długość porównywanego podciągu
length
.
public boolean regionMatches (boolean ignoreCase, int thisStart, String string, int start, int length)
Wersja przeciążona. Metoda porównuje określoną część ciągu z inną częścią ciągu, ignorując wielkość liter.
public String replace(CharSequence target, CharSequence replacement) и другие перегруженные версии
Zmienia znak lub sekwencję znaków
target
na
replacement
String testString = "wieloryb";
infoTextView.setText(testString.replace("I", "о"));
public String replaceAll (String regularExpression, String replacement)
public String replaceFirst (String regularExpression, String replacement)
Usuwa pierwsze znaki za pomocą wyrażenia regularnego. Na przykład, jeśli chcesz usunąć zera na początku liczb 001, 007, 000024, możesz skorzystać z tego połączenia.
String s = "001234-cat";
String s = s.replaceFirst ("^0*", "");
public String[] split (String regularExpression) и другие перегруженные версии
Dzieli ciąg znaków na tablicę słów. Na przykład istnieje ciąg Vaska Ryzhik Murzik Barsik i chcemy uzyskać tablicę imion kotów:
String catnames = "Васька Рыжик Мурзик Барсик";
String aCats[] = catnames.split(" ");
Otrzymujemy:
aCats[0] = Васька
aCats[1] = Рыжик
aCats[2] = Мурзик
aCats[3] = Барсик
public boolean startsWith(String prefix)
Sprawdza, czy ciąg znaków zaczyna się od znaków
prefix
z początku ciągu
String str1 = "котлета";
if(str1.startsWith("кот"))
infoTextView.setText("Слово содержит кота");
else
infoTextView.setText("Плохое слово. Нет смысла его использовать");
public boolean startsWith(String prefix, int start)
Sprawdza, czy dany ciąg zaczyna się od znaków
prefix
w określonej pozycji.
String str1 = "Суккот";
if(str1.startsWith("кот", 3))
infoTextView.setText("Слово содержит кота");
else
infoTextView.setText("Плохое слово. Нет смысла его использовать");
public CharSequence subSequence (int start, int end)
Podobna do metody
substring()
, ale może być używana do
CharSequence
.
public String substring(int start)
i inne przeciążenia Tworzy nową sekwencję/ciąg ze znakami z podanego ciągu, zaczynając od pozycji
start
do końca linii/kończąc się znakiem na pozycji
end
. Nowa linia zawiera znaki od
start
końca do końca - 1, więc bierzemy jeszcze jeden znak.
String testString = "скотина";
infoTextView.setText(testString.substring(1, 4));
public char[] toCharArray()
Kopiuje znaki w tym ciągu do tablicy znaków. Ten sam wynik można uzyskać poprzez
getChars()
. Dokumentacja nie zaleca stosowania tej metody, sugerując, że
charAt()
.
String unusualCat = "Котёнок по имени Гав";
char[] yomoe = unusualCat.toCharArray();
infoTextView.setText(String.valueOf(yomoe[3]));
public String toLowerCase() и другие перегруженные версии
Konwertuje ciąg znaków na małe litery. Domyślne ustawienia regionalne sterują konwersją. Ciąg kot = "Kot"; Łańcuch niższy = cat.toLowerCase(); infoTextView.setText(dolny);
public String toString ()
Zwraca ciąg. Dla samego sznurka, który sam w sobie jest już ciągiem, zwracanie sznurka jest bezcelowe (och, jak go wygiąłem). Ale ta metoda jest w rzeczywistości bardzo przydatna w przypadku innych klas.
public String toUpperCase()
Konwertuje ciąg znaków na wielkie litery. Domyślne ustawienia regionalne sterują konwersją.
String cat = "Кот";
String upper = cat.toUpperCase();
infoTextView.setText(upper);
public String trim()
Usuwa spacje na początku i na końcu ciągu.
String str = " Hello Kitty ".trim();
infoTextView.setText(str);
public static String valueOf(long value)
i inne przeciążenia Konwertuje zawartość (liczby, obiekty, znaki, tablice znaków) na ciąg znaków.
int catAge = 7;
infoTextView.setText(String.valueOf(catAge));
Generowanie losowego ciągu
Załóżmy, że potrzebujemy losowego ciągu podanych znaków.
private static final String mCHAR = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
private static final int STR_LENGTH = 9;
Random random = new Random();
public void onClick(View view) {
TextView infoTextView = (TextView) findViewById(R.id.textViewInfo);
infoTextView.setText(createRandomString());
}
public String createRandomString() {
StringBuilder builder = new StringBuilder();
for (int i = 0; i < STR_LENGTH; i++) {
int number = random.nextInt(mCHAR.length());
char ch = mCHAR.charAt(number);
builder.append(ch);
}
return builder.toString();
}
Porównanie ciągów: equals()
lub ==
?
Spójrzmy na przykład.
String str1 = "Murzik";
String str2 = new String(str1);
boolean isCat = str1 == str2;
infoTextView.setText(str1 + " == " + str2 + " -> " + isCat);
Chociaż obie zmienne zawierają to samo słowo, mamy do czynienia z dwoma różnymi obiektami i operator
==
zwróci
false . Kiedyś, gdy drzewa były duże, musiałem porównać dwie struny z różnych źródeł. Chociaż ciągi wyglądały dokładnie tak samo, porównanie za pomocą operatora
==
zwróciło
wartość false i pomieszało mi wszystkie karty. I dopiero wtedy dowiedziałem się, że muszę użyć pliku
equals()
. Ciąg znaków w Javie to oddzielny obiekt, który może nie być taki sam jak inny obiekt, chociaż wynik ciągu może wyglądać tak samo na ekranie. Tyle, że Java w przypadku operatora logicznego
==
(jak również
!=
) porównuje referencje do obiektów (przy pracy z prymitywami nie ma takiego problemu):
String s1 = "hello";
String s2 = "hello";
String s3 = s1;
String s4 = "h" + "e" + "l" + "l" + "o";
String s5 = new String("hello");
String s6 = new String(new char[]{'h', 'e', 'l', 'l', 'o'});
infoTextView.setText(s1 + " == " + s2 + ": " + (s1 == s2));
GO TO FULL VERSION