Нужно написать класс 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);
}
}
Дернуто с гитхаба.
Автор - Михаил Валейко.
Комментариев нет:
Отправить комментарий