Сохраняет ли Java String.getBytes (UTF-8) лексикографический порядок?

Если у меня есть лексикографически отсортированный список строк Java [s1,s2,s3,s4, ...., sn], а затем преобразование каждой строки в массив байтов с использованием кодировки UTF-8 bx = sx.getBytes("UTF-8"), является ли список массивов байтов [b1,b2,b3,...bn] также лексикографически отсортированным?


person Carsten    schedule 15.08.2012    source источник
comment
поскольку UTF-8 является кодировкой переменной ширины, я бы сказал, что порядок сортировки не сохранится   -  person Dmitry B.    schedule 16.08.2012
comment
Я не уверен, что ваш вопрос имеет смысл; как бы вы сортировали биты/байты лексикографически? Набор символов, на который вы сопоставляете эти биты/байты, является определяющим фактором.   -  person Brian Roach    schedule 16.08.2012
comment
@Brian Roach Лексикографический порядок в байтовых массивах аналогичен порядку в строках. Просто замените символ в точке x на байт в точке x. См., например. stackoverflow.com/questions/5108091/   -  person Carsten    schedule 16.08.2012
comment
@Дмитрий Не обязательно. Мне не нужно сравнивать все байты, только до первого отличия. Поскольку UTF-8 является обратимой, первая разница в длине для 2 символов должна подразумевать разницу в байтах их кодировки. Однако я не уверен, что этого достаточно для сохранения порядка.   -  person Carsten    schedule 16.08.2012
comment
@DmitryBeransky: Но UTF-8 был специально разработан для сохранения порядка сортировки.   -  person Mechanical snail    schedule 16.08.2012


Ответы (2)


Да. Согласно RFC 3239:

Порядок лексикографической сортировки байтовых значений строк UTF-8 такой же, как если бы они были упорядочены по номерам символов. Конечно, это представляет ограниченный интерес, поскольку порядок сортировки, основанный на количестве символов, почти никогда не является допустимым с культурной точки зрения.

Как указал Ян Робертс, это относится к «true UTF-8 (например, String.getBytes даст вам)», но остерегайтесь DataInputStream фальшивая UTF-8, которая будет сортировать [U+000000] после [U+000001 ] и [U+00F000] после [U+10FFFF].

person Mechanical snail    schedule 15.08.2012
comment
Для полноты отметьте, что это правильно для true UTF-8 (например, String.getBytes даст вам), но не обязательно для модифицированная кодировка UTF-8, используемая DataInputStream и друзьями. - person Ian Roberts; 16.08.2012
comment
@IanRoberts: Верно. На самом деле модифицированный UTF-8 сортирует [U+000000] после [U+000001] и [U+00F000] после [U+10FFFF]. - person Mechanical snail; 16.08.2012
comment
Вы уверены, что этот ответ правильный? Разве нормальный лексикографический порядок Java для строк не основан на кодовых точках UTF-16, а не на кодовых точках Unicode? - person R.. GitHub STOP HELPING ICE; 14.10.2013

Вы получаете список/массив объектов X в заданном порядке.

Вы создаете новый список/массив Y таких объектов, применяя метод.

Y будет иметь порядок, в котором вы его создали (обычно вы просто сохраняете порядок X). Переупорядочивания не происходит.

Кроме того, лексикографический порядок для byte[] не имеет смысла.

person SJuan76    schedule 15.08.2012
comment
лексикографический порядок для byte[] не лишен смысла. См., например. stackoverflow.com/questions/5108091/ - person Carsten; 16.08.2012