web-dev-qa-db-ja.com

String.subString()とString.subSequence()の違いは何ですか

String.subSequence()には次のjavadocがあります。

このシーケンスのサブシーケンスである新しい文字シーケンスを返します。

この形式のメソッドの呼び出し

str.subSequence(begin, end)

呼び出しとまったく同じように動作します

str.substring(begin, end) 

このメソッドは、StringクラスがCharSequenceインターフェースを実装できるように定義されています。

誰か説明できますか?

24

str.subSequence(begin, end)を使用すると、 CharSequence が返されます。これは、charのシーケンスとして表される文字列の読み取り専用形式です。例えば:

_String string = "Hello";
CharSequence subSequence = s.subSequence(0, 5);
_

charsの新しいインスタンスをインスタンス化せずにCharSequence内のCharSequenceを変更できないという意味でのみ読み取られます。

str.subSequence(begin, end)を使用する必要がある場合は、結果をStringにキャストできます。

_String string = "Hello";
String subSequence = (String) s.subSequence(0, 5);
_

_subSequence += " World";_のような通常のString演算子をすべて使用します

23
Sam

Subsequence

サブシーケンスは、サブストリング、サフィックス、およびプレフィックスの一般化です。 2つ以上の文字列のサブシーケンスである最長の文字列を見つけることは、最も長い共通のサブシーケンス問題として知られています。

例:文字列「anna」は、文字列「banana」のサブシーケンスです。

banana
 || ||
 an na

Substring

文字列の部分文字列は、文字列の接尾辞の接頭辞であり、同等に接頭辞の接尾辞です。あるストリングが別のストリングのサブストリングである場合、それはサブシーケンスでもあり、これはより一般的な概念です。

例:文字列「ana」は、2つの異なるオフセットでのバナナの部分文字列(および部分列)です。

banana
 |||||
 ana||
   |||
   ana

続きを読む こちら

しかし、Javaに関する限り、 javadoc で明確に述べられているように、それらの使用法に違いはありません。また、そこに述べられているように、メソッドsubSequenceは、Stringインターフェースに準拠するために、クラスCharSequenceにのみ実装されており、このメソッドの名前は実際には単なる誤称です。

41
Amar

これを理解するために最初に知っておく必要があるのは、substringsubsequenceの違いは何ですか?

substringは、文字列のcontinuousパートまたはサブパートです

一方

subsequenceは文字列またはシーケンスの一部であり、連続的であってもなくてもかまいませんが、要素のorderは維持されます

たとえば、次の文字列があるとします。

str_a="hello there"
str_b="hello"
str_c="Ello th"
str_d="hllo"
str_e="ho hre"
str_f="there hello"

str_bstr_aのサブストリングであり、str_cstr_aのサブストリングですが、str_dstr_aのサブストリングではありません。このサブストリングはcontinuousではありません。

これで、順序が維持されるため、すべての部分文字列は部分列になります。

str_dstr_aのサブシーケンスであり、str_estr_aのサブシーケンスですが、str_fstr_aのサブシーケンスではありませんorderは維持されません。

現在、Javaについては、これらのメソッドに関する適切な説明がjavadocにありません。

26
Nishchay

理解の簡単な言葉で:

Substring:部分文字列は、文字列内の連続する文字のシーケンスであり、順序が重要です。

Substring
string
ring

Subsequences:文字列から、任意の文字を除く。

Substring
u s i
s b t i n g
r g
4
user3133925

文字列のソースを見ると、サブシーケンスが実際に部分文字列を呼び出していることがわかります。サブストリングとの唯一の違いは、ストリングをCharSequenceにキャストすることです。

1
Bogoth

要するに、Stringオブジェクトの場合はそれほど重要ではありません。 Stringのみを受け取るものに結果を渡す必要がない限り、これらは同等です。その場合、subtring(int,int)バージョンを使用するか、subsequence(int,int)バージョンをキャストする必要がありますa String(それが内部的にそういうものだからです)。

Stringが最初に存在したため、String.substring(int,int)が最初に存在しました。 Java 1.4では、CharSequenceが追加されました。同じ機能を使用すると便利であるが、代わりにCharSequenceを返すString(柔軟性を確保するため)CharSequence.subSequence(int,int)が登場しましたが、StringCharSequenceを実装しているため、Stringは冗長に見える方法。

1
Christopher

サブストリングは連続したサブシーケンスです。

たとえば、シーケンスabcの場合、

substrings: a, ab, abc, b, bc, c, and the empty substring;
subsequences: a, b, ab, c, ac, bc, abc, and the empty subsequence.

文字が繰り返されると、一部のサブストリングとサブシーケンスは同じに見えます。

0
Rishav Bhurtel