Главная » Java » Строки и символьные массивы

0

Содержимое строки может отображаться на символьный массив и наоборот. Часто в программе бывает необходимо предварительно построить строку в массиве char, после чего создать объект String по содержимому этого массива. Если описанный ниже класс StringBuffer (допускающий запись в строки) в каком-то конкретном случае не подходит, существует несколько методов и конструкторов класса String, помогающих преобразовать строку в массив char или же массив char — в строку.

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

public static String squeezeOut(String from, char toss) {

char[] chars = from.toCharArray();

int len = chars.length;

for (int i = 0; i << len; i++) {

if (chars[i] == toss) {

–len;

System.arraycopy(chars, i + 1,

chars, i, len – i);

–i;    // рассмотреть повторно

}

}

return new String (chars, 0, len);

}

Метод squeezeOut сначала преобразует свою входную строку from в символьный массив при помощи метода toCharArray. Затем он в цикле перебирает элементы массива в поисках символа toss. Когда такой символ находится, длина возвращаемой строки уменьшается на 1, а все следующие символы массива сдвигаются к началу. Значение i уменьшается, чтобы можно было проверить новый символ в позиции i и выяснить, не

следует ли удалить и его. Когда метод завершает просмотр массива, он возвращает новый

объект String, содержащий “выжатую” строку. Для этого применяется конструктор String, которому в качестве аргументов передается исходный массив, начальная позиция внутри массива и количество символов.

Кроме того, имеется отдельный конструктор String, который получает в качестве параметра только символьный массив и использует его целиком. Оба этих конструктора создают копии массива, так что после создания String можно изменять содержимое массива — на содержимое строки это не повлияет.

При желании вместо конструкторов можно воспользоваться двумя статическими методами String.copyValueOf.  Например, метод squeezeOut мог бы заканчиваться следующей строкой:

return String.copyValueOf(chars, 0, len);

Вторая форма copyValueOf получает один аргумент и копирует весь массив. Для полноты было решено сделать два статических метода copy ValueOf эквивалентными  двум конструкторам String.

Метод toCharArray прост и достаточен в большинстве случаев. Когда желательно иметь больше возможностей для контроля за процессом копирования фрагментов строки в символьный массив, можно воспользоваться  методом getChars:

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

Копирует символы из строки в массив. Символы заданной подстроки копируются в массив начиная с dst[dstBegin]. Подстрока представляет собой фрагмент исходной строки, который начинается с позиции srcBegin и заканчивается на srcEnd (но не включает ее!). Любая попытка выхода за пределы строки или массива char приводит к возбуждению исключения IndexOutOfBoundsException.

8.7. Строки и массивы byte

Существуют методы, предназначенные  для преобразования массивов 8-разрядных символов в объекты String в 16-разрядной кодировке Unicode и наоборот. Эти методы помогают создавать строки Unicode из символов ASCII или ISO-Latin-1, которые являются первыми 256 символами в наборе Unicode. Данные методы аналогичны своим прототипам, предназначенным  для работы с символьными массивами:

public String(byte[] bytes, int hiByte, int offset, int count)

Конструктор создает новую строку, состоящую из символов заданного подмассива, входящего в массив bytes с позиции offset и состоящего из count символов. Старшие 8 бит каждого символа могут быть заданы в переменной hiByte, значение которой обычно равно

0, так как конструктор чаще всего используется для преобразования символов 8-

разрядной кодировки ASCII или ISO-Latin-1 в 16-разрядные строки Unicode. Если значения аргументов offset и coun t заставляют конструктор обратиться к элементам, выходящим за границы массива, возбуждается исключение IndexOutOfBounds.

public String(byte[] bytes, int hiByte)

Сокращенная форма для String(bytesm hibyte, 0, bytes.length).

public void  int      getBytes(int srcBegin, int srcEnd, byte[] dst,  dstBegin)

Создает копию фрагмента строки в массиве dst, начиная с dst[dstBegin]. При этом теряются старшие 8 бит каждого символа. Копирование производится с позиции srcBegin

и заканчивается в srcEnd (но не включает ее!). Любая попытка выхода за пределы строки или массива char приводит к возбуждению исключения IndexOutOfBoundsException.

Оба конструктора String, создающих строки по содержимому массива byte, производят копии данных, так что дальнейшие изменения содержимого массива никак не отражаются на содержимом строки.

Источник: Арнольд К., Гослинг Д. – Язык программирования Java (1997)

По теме:

  • Комментарии