К вопросу об utf-8. String.charAt() только алгоритмически выполняется за константное время. На практике - кешмиссы. На практике конечно оверхед charAt будет существенным, так что если б я делал utf-8, то добавил бы класс CharIterator, а в нем методы seekRelative, seekAbsolute, next, prev, currentIndex, currentChar. Как-то так.
+Yury Y да. Я о том, что если у нас есть указатель в середину, и мы знаем индекс этого символа, то относительно него продвижение вперед-назад на n символов будет за O(n). А на больших строках именно такая операция (как мне видится) - основная. И если у нас, допустим, есть позиция 10000 кодпоинта, а надо 11000, то мы можем отталкиваться от 10000 а не от 0, и мы потратим O(1000) а не O(11000). Ну и кроме того, надо на сам размер стринга смотреть. Потому, что если он например 11005, то лучше вообще на 11000 позиционироваться с конца. Вообще, в том стринге что есть сейчас, на самом деле, честных символов нет - из за долбаных суррогатов. Да, они весьма редки, но как говориться, - осадок остался. Если там где-то у вас в стринге есть суррогаты, то и length это уже не размер, и charAt это не факт что символ. Возможно, это лучше было б делать отдельным классом. Тогда стрингу оставили бы его O(1), а какой-нибудь utf8string занимал бы мало памяти.
Честно, я нихуяшеньки не понял, но ощущается, как будто понял. Оч интересно и приятно слушать
класс, два плюса
К вопросу об utf-8. String.charAt() только алгоритмически выполняется за константное время. На практике - кешмиссы.
На практике конечно оверхед charAt будет существенным, так что если б я делал utf-8, то добавил бы класс CharIterator, а в нем методы seekRelative, seekAbsolute, next, prev, currentIndex, currentChar. Как-то так.
+Yury Y да. Я о том, что если у нас есть указатель в середину, и мы знаем индекс этого символа, то относительно него продвижение вперед-назад на n символов будет за O(n). А на больших строках именно такая операция (как мне видится) - основная. И если у нас, допустим, есть позиция 10000 кодпоинта, а надо 11000, то мы можем отталкиваться от 10000 а не от 0, и мы потратим O(1000) а не O(11000). Ну и кроме того, надо на сам размер стринга смотреть. Потому, что если он например 11005, то лучше вообще на 11000 позиционироваться с конца.
Вообще, в том стринге что есть сейчас, на самом деле, честных символов нет - из за долбаных суррогатов. Да, они весьма редки, но как говориться, - осадок остался. Если там где-то у вас в стринге есть суррогаты, то и length это уже не размер, и charAt это не факт что символ.
Возможно, это лучше было б делать отдельным классом. Тогда стрингу оставили бы его O(1), а какой-нибудь utf8string занимал бы мало памяти.