StringBuffer фиксированной длины в Java - PullRequest
5 голосов
/ 18 сентября 2011

Каков наилучший способ держать фиксированную длину stringbuffer в Java? То есть, если фиксированное значение равно 10, а stringbuffer содержит ABCDEFGHIJ, когда мы добавляем K, что приведет к очистке A, а результирующее значение будет BCDEFGHIJK. Я думаю использовать комбинацию метода StringBuffer reverse () и setLenght (), но не знаю как его производительность будет для длины 100 К.

Ответы [ 2 ]

9 голосов
/ 18 сентября 2011

Звучит так, будто вы после циклического буфера .Вы можете создать char[] и сохранить размер, а также логическое начало.Затем, когда вам нужно преобразовать его в строку, вы можете просто создать две строки (одну с конца буфера и одну с начала) и объединить их вместе.Хотя это будет относительно дорого - старайтесь сохранять его как круговой буфер как можно дольше.

Убедитесь, что при каждой операции вы также учитываете возможность использования буфера , но не хотя полон.Пример операции:

public void append(char c)
{
    buffer[(size + start) % maxLength] = c;
    if (size == maxLength)
    {
        start = (start + 1) % maxLength;
    }
    else
    {
        size++;
    }
}
2 голосов
/ 18 сентября 2011

Вы можете использовать delete :

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

Update : если параметр является длинной строкой, это приводит к ненужным выделениям 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());
}
...