7

Javaの[String.substring()メソッド]( http://java.sun.com/j2se/1.5.0/docs/api/java/lang/String.html#substring (int,%20int% 29)は、そのまま指定されています。番号付きの位置から開始して、指定された文字数を返すように指示することはできません。自分で終了位置を計算する必要があります。また、終了位置を超えて終了位置を指定すると、文字列は、文字列の残りの部分を返すのではなく、Javaが例外をスローします。

私は、substring()(またはsubstr())が開始位置と長さの2つのパラメーターを受け取る言語に慣れています。これはJavaの方法よりも客観的に優れていますか?もしそうなら、それを証明できますか?あなたが見たsubstring()の最良の言語仕様は何ですか、そしてもしあるとしたら、言語が別のことをするのが良い考えになるのはいつですか?Javaが優れた設計アイデアを投げかけるIndexOutOfBoundsExceptionですか?これはすべて個人的な好みに帰着しますか?

4

6 に答える 6

9

第2引数の長さの方が便利な場合もあれば、第2引数の「前に停止するオフセット」の方が便利な場合もあります。同様に、「大きすぎるものを指定した場合は、文字列の最後に移動してください」が便利な場合もあれば、バグを示して実際には例外をスローする必要がある場合もあります。

長さである 2 番目のパラメーターは、フィールドの長さが固定されている場合に便利です。例えば:

// C#
String guid = fullString.Substring(offset, 36);

2 番目のパラメーターがオフセットであると、別の区切りがある場合に便利です。

// Java
int nextColon = fullString.indexOf(':', start);
if (start == -1)
{
    // Handle error
}
else
{
    String value = fullString.substring(start, nextColon);
}

通常、使用したいものは、私の経験では、現在のプラットフォームで提供されているものとは反対です:)

于 2009-05-19T16:15:19.010 に答える
5

私は、substring() (または substr()) が 2 つのパラメーター (開始位置と長さ) を取る言語に慣れています。これは Java よりも客観的に優れているのでしょうか? もしそうなら、それを証明できますか?

いいえ、客観的に優れているわけではありません。それはすべて、使用するコンテキストによって異なります。特定の長さの部分文字列を抽出したい場合はまずいですが、たとえば最初に出現する "." で終わる部分文字列を抽出したい場合は、文字列では、最初に長さを計算する必要がある場合よりも優れています。問題は、どの要件がより一般的かということです。私は後者だと思います。もちろん、最善の解決策は API に両方のバージョンを含めることですが、長さベースのバージョンが常に必要な場合は、静的ユーティリティ メソッドを使用することはそれほど恐ろしいことではありません。

例外としては、ええ、それは間違いなく良いデザインです。何か特定のものを要求し、その特定のものを取得できない場合、API は代わりに何を望んでいたかを推測しようとするべきではありません。そうすれば、バグがより迅速に明らかになります。

また、Java DOES には、開始インデックスから文字列の最後までの部分文字列を返す代替の substring()メソッドがあります。

于 2009-05-19T16:13:53.207 に答える
3

2番目のパラメーターはオプションである必要があり、最初のパラメーターは負の値を受け入れる必要があります。

于 2009-05-19T16:08:15.367 に答える
1

2番目のパラメーターを省略した場合、計算しなくても文字列の最後に移動します。

于 2009-05-19T16:06:27.083 に答える