1

私たちはすでに持っていdelete()ますStringBuffer。なぜ必要なのdeleteCharAt()ですか?deleteCharAt(n)同じことをしませんdelete(n, n+1)か?

4

6 に答える 6

1

ソースを見ると、delete()はdeleteCharAt()を使用しておらず、その逆も同様です。小さな違いに気づきました。インデックスが範囲内にない場合、deleteCharAtは例外をスローしますが、2番目の引数が文字列の長さを渡すと、deleteはデフォルトで文字列の長さになります。

ただし、文字列バッファの内容への影響は同じです。

于 2011-07-26T12:27:19.993 に答える
1

考えられる理由の1つは、単純さです。1つの文字を削除するために2つのパラメーターが必要なのはなぜですか?

もう1つの可能性はdelete()、の観点から実装されているため、とにかく存在する必要があり、それ自体が有用であるため、単に公開されたと宣言されただけですdeleteCharAt()deleteCharAt()しかし、ソースコードを見ると、ここではそうではないことがわかります。しかし、これは他の多くのJavaクラスで一般的なパターンです。

3番目の可能性は、メソッドが単一の文字を削除していると想定できるためdeleteCharAt()、より一般的なよりも効率的な方法で実装できることdelete()です。ただし、ここでもソースコードはこのオプションを除外しています。どちらのメソッドも、へのほぼ同じ呼び出しに解決されSystem.arraycopy()ます。

それで、私は最初のオプションに投票します。これは、プログラマーが提供する必要のあるパラメーターの数を2から1に減らすことにより、単一の文字を削除するという比較的一般的なユースケースを単純化するためだけに行われました。

于 2011-07-26T12:28:22.040 に答える
0

同じ結果が得られるかもしれませんが、実際には、ここにいくつかの効率の問題があります...

特定のインデックスで削除するには、このインデックスを1回チェックするだけで十分ですが、ある範囲のインデックスを削除する場合は、さらにいくつかチェックする必要があります。

自分で見て :

public AbstractStringBuilder delete(int start, int end) 
{
    if (start <  0)
        throw new StringIndexOutOfBoundsException(start);
    if (end  > count)
        end = count;
    if (start  > end)
        throw new StringIndexOutOfBoundsException();
    int len = end - start;
    if (len  > 0) {
        System.arraycopy(value, start+len, value, start, count-end);
        count -= len;
    }
    return this;
}

に比べ:

public AbstractStringBuilder deleteCharAt(int index) 
{
    if ((index <  0) || (index  >= count))
        throw new StringIndexOutOfBoundsException(index);
    System.arraycopy(value, index+1, value, index, count-index-1);
    count--;
    return this;
}

したがって、1つの文字だけを削除する必要がある場合は、deleteCharAtを使用して、いくつかのチェックを保存することをお勧めします。ただし、複数の連続する文字を削除する場合は、deleteを使用して、arraycopyを1回だけ呼び出し、deleteCharAtを呼び出すたびにチェックが繰り返されないようにします:)

于 2011-07-26T12:33:36.237 に答える
0

違いは関数の実装です。DeleteAt は、リストから削除するような単一のステートメントです。

于 2011-07-26T12:23:52.363 に答える
0

メソッドは正確に 1文字deleteCharAtを削除していることを認識しているため、の実装内で活用できる効率があります。

逆に、一連の文字を削除するにdelete(n, m)は、より複雑な実行パスが必要になる場合があります。これは、「より多くのことを行う」ため、必然的にコストが高くなります。

delete(n, n+1)と同じ効果がありますが、deleteCharAt(n)deleteCharAt の方がおそらく高速です。(オプティマイザは一方を他方に変換する場合があります!)。それは確かに遅くなりません。

于 2011-07-26T12:24:35.060 に答える
0

違いが 1 つあります* :がテキストの長さの
場合、StringIndexOutOfBoundsException がスローされますが、何も行われません。例外も削除もされません。 の値が大きい場合、両方とも例外をスローします。 nbuffer.length()deleteCharAt(n)delete(n, n+1)
n

IMOdeleteCharAtはまさにあなたがやりたいことなので、使用する方が良いです。使い方deleteは少しわかりにくいです。

(そしてdelete、追加のインデックスをさらにチェックします)

*ジャバ1.6

于 2011-07-26T12:55:22.173 に答える