#java #массивы #char #byte
Нужно написать класс 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)
Должен возвращать "злы".
Ответы
Ответ 1
Просто создайте новый экземпляр своего типа: @Override public CharSequence subSequence(int start, int end){ //Переопределение subSequence() return new AsciiCharSequence(Arrays.copyOfRange(a1, start, end)); } Заметьте, что toString() вы переопределили неправильно. В документации ясно сказано: String toString() Returns a string containing the characters in this sequence in the same order as this sequence. The length of the string will be the length of this sequence. То есть если вы переопределяете интерфейс CharSequence, вы обязаны вернуть в toString() строку, которая соответствует содержимому вашего CharSequence. Сделать это несложно: @Override public String toString() { //Переопределение toString() return new String(a1, java.nio.charset.StandardCharsets.ISO_8859_1); }Ответ 2
Можно переписать класс в таком виде: 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); } } Дернуто с гитхаба. Автор - Михаил Валейко.
Комментариев нет:
Отправить комментарий