5

Java で固定された stringbuffer の長さを保持するためのベスト プラクティスは何ですか? つまり、固定値が 10 で stringbuffer が ABCDEFGHIJ を保持している場合、K を追加すると A がクリアされ、結果の値は BCDEFGHIJK になります。StringBuffer の reverse() と setLenght() メソッドの組み合わせを使用することを考えていますが、わかりません100 K の長さでの性能はどうなりますか。

4

2 に答える 2

10

循環バッファを求めているようです。char[]サイズと論理的な開始点を作成して維持することができます。次に、それを文字列に変換する必要がある場合は、2 つの文字列 (1 つはバッファーの末尾から、もう 1 つは先頭から) を作成し、それらを連結するだけです。ただし、これは比較的コストがかかります。できるだけ多くの時間、循環バッファーと同じように保持するようにしてください。

ただし、各操作で、バッファーがいっぱいではない可能性も考慮するようにしてください。サンプル操作:

public void append(char c)
{
    buffer[(size + start) % maxLength] = c;
    if (size == maxLength)
    {
        start = (start + 1) % maxLength;
    }
    else
    {
        size++;
    }
}
于 2011-09-18T12:26:15.177 に答える
2

deleteを使用できます:

void append(String s) {
    buffer.append(s);
    if(buffer.length() > MAX_LENGTH){
        buffer.delete(0, buffer.length() - MAX_LENGTH);
    }
}

更新: パラメータが長い文字列の場合、不要な StringBuffer 割り当てが発生します。これを避けるには、最初にバッファを短くしてから、必要なだけ文字列の文字を追加します。

void append(String s) {
    if (buffer.length() + s.length() > MAX_LENGTH) {
        buffer.delete(0, buffer.length() + s.length() - MAX_LENGTH);
    }
    buffer.append(s, Math.max(0, s.length() - MAX_LENGTH), s.length());
}
于 2011-09-18T12:27:29.047 に答える