Java のStringに対する最も一般的なアクションは、連結、インデックスによる文字の取得、および部分文字列の取得です。この記事では、Java の部分文字列メソッドについて説明します。
Javaの部分文字列とは何ですか? この言語には、 Java メソッドのオーバーロードのおかげで、 substring()メソッド、つまり 2 つのメソッドがあります。これらを使用して、Java プログラムで部分文字列を取得できます。最初の Java サブストリング メソッドはString substring(firstIndex)で、2 番目のメソッドはString substring (firstIndex, lastIndex)です。
理解に役立つ非常に人気のあるタスク
Java 部分文字列とは何ですか?
Java の部分文字列は一般に、文字列内の連続した文字のシーケンスです。文字列の一部または文字列全体の場合もあります。
Javaで部分文字列を使用する方法
答えは簡単です。部分文字列を使用するだけです。Java substring()メソッドは文字列の一部を返します。これには 2 つの方法を使用できます。部分文字列メソッドの構文 | 文字列の部分文字列(firstIndex) | 文字列の部分文字列 (firstIndex、lastIndex) |
---|---|---|
引数 | firstIndexは、部分文字列の最初のインデックスである文字列内の数値です。包括的。部分文字列の最後の番号は文字列全体の最後の番号です | firstIndexは、部分文字列の最初のインデックスである文字列内の数値です。包括的。 lastIndexは、部分文字列から除外された最初の文字列の番号です。 |
Java で部分文字列を使用する方法の例 |
|
|
- Javaで部分文字列を取得する方法
- 指定された文字列のすべての部分文字列を検索する方法
- 最長の共通部分文字列を見つける方法
Java で部分文字列を取得する方法 (特に)
この最初の Java 部分文字列の例は非常に簡単です。文字列があるので、その中で部分文字列「CodeGym」を見つける必要があります。Java で部分文字列を取得する方法はすでに知っています。したがって、この特定の問題の解決策は次のとおりです。
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
String s1 = "the best Java Core course is CourseCodeGym. End of story";
String myTarget = "CodeGym";
int index1 = s1.indexOf(myTarget);
int index2 = index1 + myTarget.length();
System.out.println(s1.substring(index1, index2));
}
}
出力は次のとおりです。 CodeGym プロセスは終了コード 0 で終了しました 指定された文字列のすべての部分文字列を検索する方法 ここでは、指定された文字列のすべての部分文字列を検索する最も簡単な方法を示します。
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
String myTarget = "CodeGym";
for (int i = 0; i < myTarget.length(); i++) {
for (int j = i + 1; j <= myTarget.length(); j++) {
System.out.println(myTarget.substring(i, j));
}
}
}
}
出力は次のとおりです。 C Co Cod Code CodeG CodeGy CodeGym o od ode odeG odeGy odeGym d deG deGy deGym e eG eGy eGym G Gy Gym y ym m プロセスは終了コード 0 で終了しました 最長の共通部分文字列を見つける方法 最長共通部分文字列 の 問題は、コンピューター サイエンスで最も人気のあるタスクの 1 つです。ジュニア開発者の面接では、かなりの確率でこれに出会うことができます。とにかく、それを解いてみてください。これは初心者プログラマにとって非常に役立つ演習です。最長共通部分文字列問題とは、2 つ以上の文字列の部分文字列 (または部分文字列) である最長の文字列 (またはそのいくつか) を見つけることを意味します。たとえば、2つの文字列があります
String first = "CodeGym"
String second = "SomeGym"
出力は次のようになります: eGym したがって、文字列「first」と「next」を入力する必要があります。最も長い共通部分文字列を出力します。2 つ以上の部分文字列の最長共通部分文字列の値が同じである場合、それらのいずれかを出力します。この問題を自分で解決してみてから、以下のコードを調べることを強くお勧めします。
public class SubStringTest {
// in this method we are looking for the Longest common substring of
// first String with length = m and the second String with length = n
public static String longestCS(String first, String second, int m, int n) {
// the maximal length
int maxLength = 0;
// the last index of the longest common substring
int endIndex = m;
// array stores the length of substring
int[][] keeper = new int[m + 1][n + 1];
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
// check if current characters of first and second strings match
if (first.charAt(i - 1) == second.charAt(j - 1)) {
keeper[i][j] = keeper[i - 1][j - 1] + 1;
if (keeper[i][j] > maxLength) {
maxLength = keeper[i][j];
endIndex = i;
}
}
}
}
return first.substring(endIndex - maxLength, endIndex);
}
public static void main(String[] args) {
String first = "CodeGym";
String second = "SomeGym";
int m = first.length(), n = second.length();
System.out.println("The longest common substring = " + longestCS(first, second, m, n));
}
}
出力は次のようになります: 最長の共通部分文字列 = eGym
Java で部分文字列はどのように機能しますか
JDK 7 以降のバージョンでは、substring() は、 JDK 6 より前のバージョンとは異なり、作成する文字配列内の文字数をカウントしなくなり、単にメモリ (ヒープ) に新しい配列を作成し、それを参照します。 。以下に例を示します。
String x = "CodeGymIsTheBest";
String y = x.substring (2,6);
String z = x.substring (0,3);
そのため、JDK 7 以降では、オブジェクトxに適用されたsubstring()メソッドの結果として作成されたオブジェクトyおよびzは、(ヒープ上に) 新しく作成された 2 つの配列 (y の場合は {d,e, G, y}) を参照します。zの場合は{C, o}です。JDK 7 + バージョンのメソッド部分文字列では、これらの 2 つの新しい行 (つまり、2 つの新しい文字配列) が、元の文字列 myLongString ({C, o, d, e, G, y, m , i、s、t、h、e、b、e、s、t} の配列形式)。
JDK 6 バージョンの部分文字列
現在でも、一部の大規模プロジェクトでは、JDK のレガシー コード ベースに 6 回遭遇することがあります。JDK 6 では、メソッドsubstring() は別の方法で動作します。おそらくご存知のとおり、Stringは不変クラスであり、部分文字列を取得するために Java は JDK 6 の初期にこの不変性を使用しました。内部のString型のオブジェクトは単なる文字の配列であり、むしろ文字の配列を含んでいます。JDK 6 の時点では、さらに 2 つの変数 (文字配列の最初の文字の数とその数量) がそこに保存されていました。したがって、JDK 6 では、Stringにはchar value [] (文字配列)、int offset (配列内の最初の文字のインデックス)、およびint countの 3 つのフィールドがありました。(配列内の文字数)。JDK 6 で部分文字列が作成されるとき、文字の配列は新しいStringオブジェクトにコピーされません。その代わりに、両方のオブジェクトが同じ文字配列への参照を保存します。ただし、2 番目のオブジェクトには、さらに 2 つの変数、つまり部分文字列の最初のシンボルと、部分文字列に含まれるシンボルの数に関する 2 番目の変数が格納されます。メモリリークの問題のため、JDK 6 メソッドが置き換えられました。どういう意味ですか?string がありx
、 substring を使用していくつかの部分文字列を作成すると仮定します。
String x = "CodeGymIsTheBest";
String y = x.substring (2,6);
String z = x.substring (0,3);
これで、ヒープと呼ばれるメモリの特別な領域に オブジェクトxが格納され、同じオブジェクトxを参照する 2 つのオブジェクトyとzができました。xのみが2 番目から 6 番目までの要素を指し、z は0 から 3 番目までのx要素を指します。元のオブジェクトx がすでに使用されており、参照されずに放置されている場合はどうなるでしょうか? プログラムでは、他のすべてのオブジェクトはyとzのみで動作します。この場合、ガベージ コレクターはオブジェクトxを破壊する可能性があります。、メモリ配列は残り、y と z によって使用されます。メモリリークが発生します。したがって、新しい JDK 7 以降のバージョンの方法では、メモリ使用量の点でかなりコストがかかります。ただし、メモリリークを防ぐことはできます。さらに、新しい方法では文字数を計算する必要がないため、動作が速くなります。 学んだことをさらに強化するには、Java コースのビデオ レッスンを視聴することをお勧めします。
GO TO FULL VERSION