JavaRush /Blog Java /Random-PL /Klasa string
articles
Poziom 15

Klasa string

Opublikowano w grupie Random-PL
  • Metody
  • Generowanie losowego ciągu
  • Porównanie ciągów: equals()lub ==?
Klasa jest Stringbardzo często wykorzystywana przez programistów, dlatego należy się jej bardzo dobrze nauczyć. Ciąg klas - 1Pamiętaj, że obiekty klas Stringsą niezmienne. Więc jeśli myślisz, że zmieniasz ciąg, w rzeczywistości tworzysz nowy ciąg. Java ma specjalne klasy StringBuffer, StringBuilderktóre pozwalają na zmiany w ciągu. Klasy String, StringBuffer, StringBuildersą 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 Stringz obiektu klas, StringBufferużywając StringBuildernastę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 $sciągów znaków lub $dliczb. 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)); // возвращает 1105
public int codePointBefore(int index) Zwraca znak Unicode poprzedzający podany indeks
String testString = "Котёнок";
int myChar = testString.codePointBefore(4);
tv.setText(String.valueOf(myChar)); // возвращает 1105
public int codePointCount(int start, int end) Oblicza liczbę znaków Unicode między pozycjami startiend
String testString = "Котёнок";
int myChar = testString.codePointCount(0, 3);
tv.setText(String.valueOf(myChar)); // возвращает 3
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("котёнок")); // возвращает -32
}
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ówCharSequence
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, Datazaczynają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
// выводим число типа float с двумя знаками после запятой
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);
// выводим результат в TextView
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);
// число 255 будет выведено Jak ff
infoTextView.setText(strResult);
W przypadku użycia wielkich liter %Xbędzie ffto 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) + // (MM/DD/YY)
		String.format(locale, "%tF\n", now) + // (YYYY-MM-DD)
		String.format(locale, "%tr\n", now) + // Full 12-hour time
		String.format(locale, "%tz\n", now) + // Time zone GMT offset
		String.format(locale, "%tZ\n", now)); // Localized time zone bbreviation
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 = "котёнок";
// символ ё встречается в четвёртой позиции (index = 3)
infoTextView.setText(String.valueOf(testString.indexOf("ё")));
public int indexOf (int c, int start) Wyszukuje indeks od, zaczynając od pozycjistart
String testString = "котёнок";
// вернёт -1, так Jak после 5 символа буквы ё нет
infoTextView.setText(String.valueOf(testString.indexOf("ё", 4)));
public int indexOf (String string) Wyszukuje ciąg znakówsubString
String testString = "У окошка";
infoTextView.setText(String.valueOf(testString.indexOf("кошка")));
public int indexOf (String subString, int start) Wyszukuje ciąg znaków subStringzaczynając od pozycjistart
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()) {
    // здесь ваш kod
}
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())); // возвращает 7 (семь символов)
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 codePointOffsetod 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 targetnareplacement
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*", ""); // останется 1234-cat
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 prefixz 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 prefixw 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 startdo końca linii/kończąc się znakiem na pozycji end. Nowa linia zawiera znaki od startkoń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));
// попробуйте и другие варианты
// infoTextView.setText(s1 + " equals " + s2 + ": " + (s1.equals(s2)));
// infoTextView.setText(s1 + " == " + s3 + ": " + (s1 == s3));
// infoTextView.setText(s1 + " equals " + s3 + ": " + (s1.equals(s3)));
// infoTextView.setText(s1 + " == " + s4 + ": " + (s1 == s4));
// infoTextView.setText(s1 + " equals " + s4 + ": " + (s1.equals(s4)));
// infoTextView.setText(s1 + " == " + s5 + ": " + (s1 == s5)); // false
// infoTextView.setText(s1 + " equals " + s5 + ": " + (s1.equals(s5)));
// infoTextView.setText(s1 + " == " + s6 + ": " + (s1 == s6)); // false
// infoTextView.setText(s1 + " equals " + s6 + ": " + (s1.equals(s6)));
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION