JavaRush /Java Blog /Random-JA /文字列クラス
articles
レベル 15

文字列クラス

Random-JA グループに公開済み
  • メソッド
  • ランダムな文字列を生成する
  • 文字列比較:equals()または==?
このクラスはStringプログラマーによって頻繁に使用されるため、よく学習する必要があります。 クラス文字列 - 1クラスオブジェクトはString不変であることに注意してください。したがって、文字列を変更していると思っても、実際には新しい文字列を作成していることになります。Java には特別なクラスがありStringBufferStringBuilder文字列を変更できます。クラスStringStringBuffer、はjava.langStringBuilderパッケージで定義されており、インポート宣言なしで自動的に使用可能になります。3 つのクラスはすべてインターフェイスを実装します。文字列の作成は非常に簡単です。たとえば、次のようにすることができます。 CharSequence
String aboutCat = "Кот - это звучит гордо, а если наступить на хвост, то громко";
文字列の配列を作成できます。
String[] cats = {"Васька", "Barsik", "Murzik"};
空のクラス オブジェクトを作成できますString
String str = new String();
文字配列を使用して文字列を作成できます。
char[] chars = { 'c', 'a', 't' };
String str = new String(chars);
文字配列の範囲を設定できるコンストラクターもあります。範囲の開始と使用する文字数を指定する必要があります。
char[] chars = {'c', 'a', 't', 'a', 'm', 'a', 'r', 'a', 'n' };
String str = new String(chars, 0, 3);
次のコンストラクター を使用して、Stringクラス オブジェクトから クラス オブジェクトを作成できます。StringBufferStringBuilder
String(StringBuffer an object_StrBuf)
String(StringBuilder an object_StrBuild)

演算子+と +=String

Java では、プラス記号 ( +) は文字列の連結、つまり文字列の結合を意味します。
String cat = "Кот";
String name = "Васька";
//складываем две строки и пробел между ними, чтобы слова не слиплись
String fullname = cat + " " + name; // получится Кот Васька
式内のオペランドの 1 つに文字列が含まれている場合、他のオペランドも文字列である必要があります。したがって、Java 自体は、変数が文字列でない場合でも、変数を文字列表現にキャストできます。
int digit = 4;
String paws = " лапы";
String aboutcat = digit + paws; // хотя мы складываем число и строку, но все равно получим строку
За кулисами Java за нас преобразовало число 4 в строку "4"

文字列の書式設定

文字列リソースがあると仮定しましょう。
<string name="aboutcat">У кота по имени Барсик четыре лапы, один хвост. Ему 5 лет</string>
この文字列をプログラムで要素に表示するにはTextView、次のコードを使用できます。
TextView tvCatsInfo = (TextView)findViewById(R.id.textView1);
tvCatsInfo.setText(R.string.aboutcat);
あなたが数匹の猫を飼っていると想像してください。もちろん、猫ごとに独自のラインを作成することもできます。しかし、セリフは非常に似ており、名前と年齢が変わるだけです。足と尻尾の数を変更することもできます (何を吸っていますか?)。このような場合は、文字列の書式設定を適用できます。変更する単語を決定し、パーセント記号で始まり、次に 1 ずつ増加する数値、次に$s文字列または$d数値の特別な文字セットに置き換える必要があります。そこで、文字列リソースを次のように変更しましょう。
<string name="aboutcat">У кота по имени %1$s %2$s лапы, %3$s хвост. Ему %4$d лет</string>
コードに変更を加えてみましょう。
String strBarsik = "Barsik";
String strPaws = "четыре";
String strTail = "one";
int year = 5;
String strCats = getResources().getString(R.string.aboutcat);
String strFinal = String.format(strCats, strBarsik, strPaws, strTail, year);
tvCatsInfo.setText(strFinal);
6 歳の猫 Vaska を飼っている場合、2 つの変数を追加して行をフォーマットします
String strVaska = "Васька";
year = 6;
String strFinal = String.format(strCats, strVaska, strPaws, strTail, year);
tvCatsInfo.setText(strFinal);
簡単な書式設定の例を次に示します。覚えておいて、適切な場所で使用してください。

文字列リソース

文字列をリソースに保存することをお勧めします。プログラムによる文字列リソースへのアクセスは次のように行われます。
String catName = getResources().getString(R.string.barsik);

リソース内の文字列配列から文字列を抽出する

という名前のstrings.xmlファイルに文字列配列が定義されているとしますcats_array。その後、次のようにリソースから行にアクセスできます。
Resources res = getResources();
String[] cats = res.getStringArray(R.array.cats_array);

メソッド

public char charAt (int index) この文字列内の指定されたオフセットにある文字を返します。カウントダウンは 0 から始まります。負の値や存在しない値を使用する必要はありません。もっと真剣に考えてください。複数の文字を抽出するには、 を使用しますgetChars()
String testString = "Котёнок";
char myChar = testString.charAt(2);
tv.setText(Character.toString(myChar)); // выводит третий символ - т
public int codePointAt(int index) 指定されたインデックスの Unicode 文字を返します。
String testString = "Котёнок";
int myChar = testString.codePointAt(3);
tv.setText(String.valueOf(myChar)); // возвращает 1105
public int codePointBefore(int index) 指定されたインデックスの前にある Unicode 文字を返します。
String testString = "Котёнок";
int myChar = testString.codePointBefore(4);
tv.setText(String.valueOf(myChar)); // возвращает 1105
public int codePointCount(int start, int end)start位置と 位置の間の Unicode 文字の数を計算します。end
String testString = "Котёнок";
int myChar = testString.codePointCount(0, 3);
tv.setText(String.valueOf(myChar)); // возвращает 3
public int compareTo(String string) Unicode 文字値を使用して指定された文字列を比較し、どの文字列が次の文字列より小さいか、等しいか、または大きいかを計算します。仕分けに使えます。大文字と小文字が考慮されます。文字列が一致する場合は 0 が返され、ゼロより小さい場合は呼び出し文字列が string より小さくstring、ゼロより大きい場合は呼び出し文字列が string より大きいことが返されますstring。大文字の単語は小文字の単語の上に配置されます。
String testString = "Котёнок";

if (testString.compareTo("котёнок") == 0) {
    tvInfo.setText("Строки равны");
} else {
    tvInfo.setText("Строки не равны. Возвращено"
            + testString.compareTo("котёнок")); // возвращает -32
}
バブル ソートを使用して文字列の配列を並べ替えてみましょう。
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]);
}
結果として、次のことが得られます。
Мы
везём
кота
с
собой
ご覧のとおり、用語の位置を変更しても、猫のソート合計は変わりません。 public int compareToIgnoreCase (String string) Unicode 文字値を使用して、大文字と小文字を区別せずに、指定された文字列を比較します。
String testString = "Котёнок";

if (testString.compareToIgnoreCase("котёнок") == 0) {
    tv.setText("Строки равны"); // слова одинаковы, если не учитывать регистр
} else {
    tv.setText("Строки не равны. Возвращено"
            + testString.compareTo("котёнок"));
}
public String concat (String string) 文字列を指定された文字列と連結します。2 つの文字列を連結した新しい文字列が返されます。メソッド名自体に猫が含まれていることに注意してください。
String testString = "Сук";
String newString = testString.concat("кот");
tv.setText(newString);
このメソッドは演算子と同じ機能を実行し+、次のように記述することができますСук + кот。しかし、本物の猫派の人は「猫」という方法を使います。 public boolean contains (CharSequence cs) 文字列に一連の文字が含まれているかどうかを判断します。CharSequence
String testString = "котёнок";

if(testString.contains("кот")){
    infoTextView.setText("В слове котёнок содержится слово кот!");
}
public static String copyValueOf (char[] data, int start, int length)長さlengthDataの位置start(0 から始まる番号付け)から始まる 配列から、指定された文字を含む新しい文字列を作成します。 指定された配列の文字を含む新しい文字列を作成します。行の作成後に配列を変更しても、作成された行は変更されません。 文字列が で終わるかどうかを確認します。 public static String copyValueOf(char[] data)public boolean endsWith(String suffix)suffix
String str1 = "Суккот";

if(str1.endsWith("кот"))
    infoTextView.setText("Слово заканчивается на котике");
else
    infoTextView.setText("Плохое слово. Нет смысла его использовать");
public boolean equals (Object string) 指定されたオブジェクトと文字列を比較し、比較された文字列が等しい場合にtrueを返します。同じ文字が同じ順序で含まれており、大文字と小文字が区別されます。
String str1 = "Кот";
String str2 = "Кошка";

if(str1.equals(str2))
    infoTextView.setText("Строки совпадают");
else
    infoTextView.setText("Строки не совпадают");
==このメソッドを、2 つのオブジェクト参照を比較し、それらが同じインスタンスを参照しているかどうかを判断する 演算子と混同しないでください。「文字列比較」を参照してください:equals()または==? public boolean equalsIgnoreCase(String string) 指定された文字列とソース文字列を大文字と小文字を区別せずに比較し、等しい場合にtrueを返します。AZ 範囲は AZ 範囲と等しいとみなされます。
String str1 = "Кот";
String str2 = "кот";

if(str1.equalsIgnoreCase(str2))
    infoTextView.setText("Строки совпадают");
else
    infoTextView.setText("Строки не совпадают");
public static String format(Locale locale, String format, Object... args)
指定された形式と指定されたスコープにローカライズされた引数を使用して、書式設定された文字列を返します。たとえば、日付や時刻など
// выводим число типа float с двумя знаками после запятой
String.format("%.2f", floatValue);
新しい行に現れる 2 つの単語を接着します。この場合、2 番目の単語は大文字で表示されます。
String str1 = "Кот";
String str2 = "васька";
String strResult = String.format("%s\n%S", str1, str2);
// выводим результат в TextView
infoTextView.setText(strResult);
数値を 8 進数に変換します。
String str1 = "8";
int inInt = Integer.parseInt(str1); // конвертируем строку в число
String strResult = String.format("(Восьмеричное meaning): %o\n", inInt);

infoTextView.setText(strResult);
同様に、16 進数で表示します
String str1 = "255";
int inInt = Integer.parseInt(str1);
String strResult = String.format("(Шестнадцатеричное meaning): %x\n", inInt);
// число 255 будет выведено How ff
infoTextView.setText(strResult);
大文字を使用する場合は%X、 にffなりますFF。10 進数の場合は を使用します%d。日付はさまざまな方法で表示することもできます。
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) 指定された形式を使用して書式設定された文字列を返します。 public void getBytes(int start, int end, byte[] data, int index)およびその他のオーバーロード このメソッドは、文字をバイト配列に保存します。これはgetChars()、. 他の Unicode 文字を使用するさまざまなソースから文字列をエクスポートするときによく使用されます。たとえば、Java はデフォルトで 16 ビット Unicode 文字を処理し、インターネットでは、文字列は 8 ビット Unicode、ASCII などを使用することがよくあります。 public void getChars(int start, int end, char[] buffer, int index) 文字列から複数の文字を抽出する方法。部分文字列の先頭のインデックス ( start)、抽出する部分文字列の末尾に続く文字のインデックス ( end ) を指定する必要があります。選択された文字を受け取る配列は、バッファーパラメーターにあります。部分文字列の書き込みを開始する配列内のインデックスは、indexパラメーターに渡されます。配列が、指定された部分文字列内のすべての文字を含むのに十分な大きさであることを確認してください。
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() このオブジェクトのハッシュ コードである整数を返します。 public int indexOf(int c) 指定されたインデックス c で最初に見つかった位置の番号を返します。
String testString = "котёнок";
// символ ё встречается в четвёртой позиции (index = 3)
infoTextView.setText(String.valueOf(testString.indexOf("ё")));
public int indexOf (int c, int start) 位置から開始してインデックスを検索しますstart
String testString = "котёнок";
// вернёт -1, так How после 5 символа буквы ё нет
infoTextView.setText(String.valueOf(testString.indexOf("ё", 4)));
public int indexOf (String string) 文字列を検索しますsubString
String testString = "У окошка";
infoTextView.setText(String.valueOf(testString.indexOf("кошка")));
public int indexOf (String subString, int start)subString位置から始まる 文字列を検索します。start
String testString = "У окошка";
infoTextView.setText(String.valueOf(testString.indexOf("кошка", 2)));
public String intern () 文字列を「ハッシュ」します。 public boolean isEmpty () 文字列が空かどうかを確認します。
if(catname.isEmpty()) {
    // здесь ваш code
}
このメソッドは API 9 (Android 2.1) で登場しました。古いデバイスの場合は、String.length() == 0 public int lastIndexOf (String string) и другие перегруженные версии 指定されたインデックスで最後に検出された位置の番号を返します。たとえば、次のように拡張子なしのファイル名を取得できます。
filename.toString().substring(0, filename.getString().lastIndexOf("."));
この例では、最後の点の位置を取得し、その前の部分文字列を取得します。 public int length() 文字列の長さを返します
String testString = "котёнок";
infoTextView.setText(String.valueOf(testString.length())); // возвращает 7 (семь символов)
public boolean matches(String regularExpression) 文字列が正規表現と一致するかどうかを確認します。
public int offsetByCodePoints (int index, int codePointOffset)
codePointOffsetパラメータで指定された開始位置から 離れた位置にある位置を返します。index public boolean regionMatches (int thisStart, String string, int start, int length) このメソッドは、文字列の指定された部分と文字列の別の部分を比較します。クラスの呼び出し元オブジェクトの行範囲の先頭のインデックスを指定する必要がありますString。比較する文字列はパラメータで渡されますstring。比較を実行する必要がある文字のインデックスがパラメータに渡されstart、比較される部分文字列の長さがパラメータに渡されますlengthpublic boolean regionMatches (boolean ignoreCase, int thisStart, String string, int start, int length) オーバーロード版。このメソッドは、大文字と小文字を区別せずに、文字列の指定された部分を文字列の別の部分と比較します。 public String replace(CharSequence target, CharSequence replacement) и другие перегруженные версии 文字または文字列をtarget次のように変更します。replacement
String testString = "whale";
// меняем и на о
infoTextView.setText(testString.replace("And", "о")); // возвращается кот
public String replaceAll (String regularExpression, String replacement) public String replaceFirst (String regularExpression, String replacement) 正規表現を使用して最初の文字を削除します。たとえば、番号 001、007、000024 の先頭のゼロを削除する必要がある場合は、この呼び出しを使用できます。
String s = "001234-cat";
String s = s.replaceFirst ("^0*", ""); // останется 1234-cat
public String[] split (String regularExpression) и другие перегруженные версии 文字列を単語の配列に分割します。たとえば、Vaska Ryzhik Murzik Barsik という文字列があり、猫の名前の配列を取得したいとします。
String catnames = "Васька Рыжик Мурзик Барсик";
String aCats[] = catnames.split(" ");  // по пробелу
我々が得る:
aCats[0] = Васька
aCats[1] = Рыжик
aCats[2] = Мурзик
aCats[3] = Барсик
public boolean startsWith(String prefix) 文字列がprefix文字列の先頭の 文字で始まっているかどうかを確認します
String str1 = "котлета";

if(str1.startsWith("кот"))
    infoTextView.setText("Слово содержит кота");
else
    infoTextView.setText("Плохое слово. Нет смысла его использовать");
public boolean startsWith(String prefix, int start) 指定された文字列がprefix指定された位置の文字で始まるかどうかを確認します。
String str1 = "Суккот";

if(str1.startsWith("кот", 3))
    infoTextView.setText("Слово содержит кота");
else
    infoTextView.setText("Плохое слово. Нет смысла его использовать");
public CharSequence subSequence (int start, int end) メソッドに似ていますsubstring()が、 に使用できますCharSequencepublic String substring(int start)およびその他のオーバーロードstart指定された文字列から、position で始まり行の終わり/position の文字で終わる文字を 含む新しいシーケンス/文字列を作成しますend。新しい行には、start末尾 - 1 までの文字が含まれるため、さらに 1 文字を取ります。
String testString = "скотина";

infoTextView.setText(testString.substring(1, 4)); // возвращается кот
public char[] toCharArray() この文字列内の文字を文字配列にコピーします。を介しても同じ結果が得られますgetChars()。ドキュメントではこの方法の使用を推奨しておらず、 を推奨していますcharAt()
String unusualCat = "Котёнок по имени Гав";

char[] yomoe = unusualCat.toCharArray();
infoTextView.setText(String.valueOf(yomoe[3]));
public String toLowerCase() и другие перегруженные версии 文字列を小文字に変換します。デフォルトのロケールによって変換が制御されます。文字列 cat = "猫"; 文字列下 = cat.toLowerCase(); infoTextView.setText(下位); public String toString () 文字列を返します。文字列自体は、それ自体がすでに文字列であるため、文字列を返すことは無意味です (ああ、なんて曲げたんだろう)。しかし、このメソッドは実際には他のクラスにも非常に役立ちます。 public String toUpperCase() 文字列を大文字に変換します。デフォルトのロケールによって変換が制御されます。
String cat = "Кот";
String upper = cat.toUpperCase();
infoTextView.setText(upper);
public String trim() 文字列の先頭と末尾のスペースを削除します。
String str = "   Hello Kitty  ".trim();
infoTextView.setText(str);
public static String valueOf(long value)およびその他のオーバーロード 内容 (数値、オブジェクト、文字、文字配列) を文字列に変換します。
int catAge = 7; // это число

infoTextView.setText(String.valueOf(catAge)); // преобразовано в строку

ランダムな文字列を生成する

与えられた文字のランダムな文字列が必要だとしましょう。
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();
}

文字列比較:equals()または==?

例を見てみましょう。
String str1 = "Murzik";
String str2 = new String(str1);
boolean isCat = str1 == str2;

infoTextView.setText(str1 + " == " + str2 + " -> " + isCat);
2 つの変数には同じ単語が含まれていますが、2 つの異なるオブジェクトを扱っているため、演算子はfalse==を返します。かつて、木が大きかったときに、異なるソースからの 2 つの文字列を比較する必要がありました。文字列はまったく同じに見えましたが、演算子を使用した比較ではfalseが返され、すべてのカードが混乱してしまいました。そしてそのとき初めて、 を使用する必要があることがわかりました。Java の文字列は別のオブジェクトであり、画面上では文字列の出力が同じに見える場合でも、別のオブジェクトと同じではない可能性があります。Java は、論理演算子(および)の場合、参照とオブジェクトを比較するだけです (プリミティブを扱う場合にはそのような問題は発生しません)。 ==equals()==!=
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)));
コメント
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION