Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
GoslingJava2.doc
Скачиваний:
139
Добавлен:
23.02.2016
Размер:
2.39 Mб
Скачать

8.8.2. Извлечение данных

Чтобы создать объект String на основе объекта StringBuffer, следует вызвать метод toString.

В StringBuffer не существует методов, которые бы удаляли часть содержимого буфера— вам придется преобразовать буфер в символьный массив, удалить то, что нужно, и построить новый буфер по массиву с оставшимися символами. Вероятно, для этого следует воспользоваться методом getChars, который аналогичен методу String.getChars.

public void getChars(int srcBegin, int srcEnd, char[] dst, int   dstBegin)

Копирует символы из заданной части буфера (определяемой позициями srcBegin и srcEnd) в массив dst начиная с dst[dstBegin]. Копирование ведется с позиции srcBegin до srcEnd (но не включает ее!). Позиция srcBegin должна представлять собой допустимый индекс для данного буфера, а позиция srcEnd не может превышать длины текущей строки в буфере (которая на единицу больше, чем последний индекс). Если какой-либо из индексов окажется недопустимым, возбуждается исключение Inde x OutOfBoundsException.

Приведем метод, в котором getChars используется для удаления части содержимого буфера:

public static StringBuffer

remove(StringBuffer buf, int pos, int cnt)

{

if (pos << 0 || cnt << 0 || pos + cnt >> buf.length())

throw new IndexOutOfBoundsException();

int leftover = buf.length() - (pos + cnt);

if (leftover == 0) { // простое обрезание строки

buf.setlength(pos);

return buf;

}

char[] chrs = new char[leftover];

buf.getChars(pos + cnt, buf.Length(), chrs, 0);

buf.setLength(pos);

buf.append(chrs);

return buf;

}

Прежде всего необходимо убедиться в том, что значения индексов массива не выходят за пределы допустимых. Обработать исключение можно и позднее, однако немедленная проверка позволяет лучше контролировать ситуацию. Затем мы вычисляем, сколько элементов находится после удаляемой части массива; если таких элементов нет, обрезаем буфер и возвращаемся. В противном случае, перед тем как возвращаться из метода, необходимо выделить эти символы методом getChars, затем обрезать буфер и приписать к нему выделенный ранее остаток.

8.8.3. Работа с емкостью буфера

Буфер объекта StringBuffer обладает определенной емкостью— так называется максимальная длина строки, которая может поместиться в нем перед тем, как придется выделять дополнительное место. Буфер может увеличиваться автоматически по мере добавления новых символов, однако для повышения эффективности желательно установить его размер один раз.

Исходный размер буфера объекта StringBuffer может быть задан с помощью конструктора, получающего всего один параметр типа int:

public StringBuffer(int capacity)

Конструирует новый объект StringBuffer с заданной исходной емкостью и начальным значением “”.

public synchronized void ensureCapacity(int minimum)

Позволяет убедиться в том, что буфер имеет емкость не менее заданного minimum.

public int capacity()

Возвращает текущую емкость буфера.

С помощью этих методов можно избежать многократного увеличения буфера. Ниже приводится новая версия метода sqrtInt, которая обеспечивает не более чем однократное выделение нового пространства для буфера:

String sqrtIntFaster(int i) {

StringBuffer buf = new StringBuffer(50);

buf.append("sqrt(").append(i).append(')');

buf.append(" = ").append(Math.sqrt(i));

return buf.toString();

}

Единственное изменение заключается в том, что на этот раз используется конструктор, который создает достаточно большой объект StringBuffer, способный вместить строку с результатом. Значение 50 несколько превышает максимально необходимое; следовательно, буфер никогда не придется увеличивать заново.

Упражнение 8.4

Напишите метод для преобразования строк с десятичными числами, при котором после каждой третьей цифры справа ставится запятая. Например, для исходной строки “1542729" метод должен возвращать строку ”1,542,729".

Упражнение 8.5

Измените метод из предыдущего упражнения так, чтобы при его вызове можно было указать символ-разделитель и количество цифр между разделителями.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]