Страницы

Поиск по вопросам

понедельник, 1 апреля 2019 г.

Как привести массив byte[] к виду CharSequence?

Нужно написать класс AsciiCharSequence, который реализует хранение последовательности ASCII-символов в массиве байт. По сравнению с классом String, хранящим каждый символ как char, AsciiCharSequence будет занимать меньше памяти.
Класс AsciiCharSequence должен:
реализовывать интерфейс java.lang.CharSequence иметь конструктор, принимающий массив байт; определять методы length(), charAt(), subSequence() и toString()
Ну вот я почти написал:
public class AsciiCharSequence implements CharSequence {
byte[] a1;
public AsciiCharSequence(byte[] a){ //Конструктор класса a = this.a1; }
@Override public String toString() { //Переопределение toString() return "AsciiCharSequence{" + "a1=" + Arrays.toString(a1) + '}'; }
@Override public int length(){ return a1.length; }; //Переопределение length()
@Override public char charAt(int index){ //Переопределение charAt() char t000 = (char)a1[index]; return t000; }
@Override public CharSequence subSequence(int start, int end){ //Переопределение subSequence() CharSequence buf[] = new CharSequence[end - start];
for(int i=start; i<=end;i++) { byte t = a1[i-start]; buf[i]=(CharSequence)t; } return buf[end -start]; } }
Самый проблемный участок = Переопределение subSequence(). Это последние 12 строчек с конца. Проблема такая: я никак не могу написать код, чтобы метод возвращал корректный тип (CharSequence?). Если алгоритм формирования массива более-менее понятен, то преобразование массива byte[] в CharSequence совсем не ясен. Сам метод должен применяться на массив символов и возвращать массив символов с индексами лежащими от start до end. К примеру,
String s0 = "Вова и Дима козлы"; s0.subSequence(14,16)
Должен возвращать "злы".


Ответ

Можно переписать класс в таком виде:
public class AsciiCharSequence implements CharSequence { private byte[] data;
public AsciiCharSequence(byte[] data) { this.data = data; }
@Override public int length() { return data.length; }
@Override public char charAt(int index) { return (char) (data[index] & 0xff); }
@Override public CharSequence subSequence(int start, int end) { int length = end - start; byte[] bytes = new byte[length]; for (int i = 0, j = start; i < length; i++, j++) { bytes[i] = data[j]; } return new AsciiCharSequence(bytes); }
@Override public String toString() { return new String(data); } }
Дернуто с гитхаба. Автор - Михаил Валейко.

Комментариев нет:

Отправить комментарий