Рядки та символьні масиви

Вміст рядка може відображатися на символьний масив і навпаки Часто в програмі буває необхідно попередньо побудувати рядок у масиві char, після чого створити обєкт String по вмісту цього масиву Якщо описаний нижче клас StringBuffer (що допускає запис в рядки) в якомусь конкретному випадку не підходить, існує кілька методів і конструкторів класу String, що допомагають перетворити рядок в масив char або ж масив char – у рядок

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

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

char[] chars = fromtoCharArray()

int len = charslength

for (int i = 0 i &lt&lt len i++) {

if (chars[i] == toss) {

–len

Systemarraycopy(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 можна змінювати вміст масиву – на вміст рядка це не вплине

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

return StringcopyValueOf(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

87 Рядки і масиви 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, byteslength)

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

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

і закінчується в srcEnd (але не включає її) Будь-яка спроба виходу за межі рядка або масиву char призводить до порушення винятку IndexOutOfBoundsException

Обидва конструктора String, що створюють рядки по вмісту масиву byte, виробляють копії даних, так що подальші зміни вмісту масиву ніяк не відбиваються на вмісті рядка

Джерело: Арнольд К, Гослінг Д – Мова програмування Java (1997)

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*