次のことについて、どのように判断すればよいか教えてください。
A. 空の文字列は次の部分文字列と見なされます:
- 別の空の文字列
- 空でない文字列
B. 空の文字列は次の順列と見なされますか?
- 別の空の文字列
次のことについて、どのように判断すればよいか教えてください。
最初の 2 つは、次の方法で自分でテストできますcontains
。
/* 1 */ System.out.println("".contains(""));
/* 2 */ System.out.println("abc".contains(""));
真実 真実
あなたの最後の質問については、空集合の順列がいくつあるかを尋ねることに似ているようです。であり、その答えは0! = 1
- つまり、そうです。空集合はそれ自体の順列です。したがって、数学的な意味で、空文字列はそれ自体の順列と見なすことができます。
あなたが念頭に置いている順列の実装はわかりませんが、一般的には、空は空のサブセットであるという事実に基づいて、空の文字列は別の空の文字列の有効な順列であると期待する必要があります。
String foo = "hello!";
String bar = "world";
String baz = "";
String qux = "wor";
String ipsem = "";
System.out.println(foo.contains(bar)); //false
System.out.println(foo.contains(baz)); //true
System.out.println(baz.contains(foo)); //false
System.out.println(bar.contains(qux)); //true
System.out.println(baz.contains(ipsem)); //true
Junit で実際のテストを書きましょう。
また、インターンされた Stringsにも注意してください。最後のテストでisNotConsideredIdenticalVariable
は、コンパイラの最適化を停止するためのトリックが必要です (つまり、自動インターン)。
import org.junit.Assert;
import org.junit.Test;
public class EmptyStringTest {
@Test
public void isConsideredSubstringOfEmpty() throws Exception
{
Assert.assertTrue("".contains(""));
}
@Test
public void isConsideredSubstringOfNonEmpty() throws Exception
{
Assert.assertTrue("NOT EMPTY".contains(""));
}
@Test
public void isConsideredEqual() throws Exception
{
Assert.assertEquals("", "");
}
@Test
public void isConsideredIdenticalLiteral() throws Exception
{
Assert.assertTrue("" == "");
}
@Test
public void isNotConsideredIdenticalVariable() throws Exception
{
String firstInstance = "a".replaceAll("a", "");
String differentInstance = "";
Assert.assertFalse(differentInstance == firstInstance);
}
}
「java」というタグで質問されているので、String
型のことを言っているのだと思います。
Java の空String
は、 を使用して生成できるという意味で、別の空または空でない文字列の部分文字列と見なすことができますString.substring()
。(すべての空の String インスタンスをそのように生成できるわけではありませんが、 を使用して String を比較している場合equals
、それは関係ありません ...)
Java String
API は操作を定義しませんpermute
。これは、それがどのように動作するかを言うことができないことを意味します. 質問の 2 番目の部分は答えられません。
文字列の他のモデルについて話している場合、答えは完全にモデルによって異なります。
あなたが(実際に)文字列をモデル化する方法についてのアドバイスを求めているなら...それならあなたの質問には答えられないと思います。繰り返しになりますが、回答は、残りの文字列モデルをどのように定義したかによって異なります。
しかし、私のアドバイスが必要な場合は、文字列モデルをどのように使用するかを検討する必要があります。文字列の部分文字列のセットに元の文字列を含めると便利ですか? 文字列の順列のセットに元の文字列を含めることは有用ですか? 論理的な結果は何ですか...
最後に、このウィキペディアのページには、文字列の「形式理論」が含まれています。数学者ではない私の目には良さそうに見えますが、このページには形式理論のセクションに関連していると思われる参考文献が一切引用されていません。