2016-12-14 22 views
-2

Я хочу, чтобы иметь возможность кодировать любую строку в действительное имя класса java, а затем декодировать это имя класса обратно в предоставленную строку. Я хочу иметь возможность сделать это без потерь, т. Е. Никакие две строки не могут быть закодированы для одного и того же имени класса java.Есть ли способ выполнить преобразование без потерь из строки в имя класса java?

Возможно ли это?

+0

Можно ли преобразовать две равные строки в одинаковые имена классов? Какова цель этого? Что вы имеете в виду без потерь? –

+1

@SamuelFrench Да, потому что это те же строки. Кроме того, если вы не знаете, что без потерь, я не думаю, что вы готовы ответить на этот вопрос. – Ogen

+0

Вы (вероятно) ищете двунаправленную карту. См. Здесь для получения дополнительной информации: http://stackoverflow.com/questions/9783020/bidirectional-map Кроме того, без потерь подразумевается сжатие, которое вы вообще не указываете, и это, безусловно, здесь не требуется. – mascoj

ответ

4

Это, безусловно, возможно.

В любой ситуации, когда вам нужно преобразовать произвольные строки для использования ограниченного набора символов, вам просто нужно изобрести escape-последовательность.

Например, выберите _ в качестве символа escape, затем замените любой недопустимый символ или любое подчеркивание в исходной строке с символом подчеркивания, за которым следует 8 шестнадцатеричных цифр кода кодировки Unicode.

+0

Хорошо, но как насчет ситуации с двумя следующими входами: 'my $ String' преобразуется в' my_12345678String'. Что происходит, когда я пытаюсь закодировать другой вход, называемый 'my_12345678String'? Не получаю ли я такое же закодированное значение ? – Ogen

+0

Вот почему вам также необходимо кодировать символы подчеркивания. – SLaks

+0

Итак, в чем смысл преобразования недопустимых символов в подчеркивание в первую очередь, если вы просто собираетесь их кодировать? Напротив, не превратили бы их всех в подчеркивания, это будет плохо, потому что все недопустимые символы будут закодированы в одно и то же? – Ogen

5

Ответ на это явно нет. Существует только конечное число возможных строк Java, и не все из них являются допустимыми именами классов. Поэтому вы просите биекцию между двумя наборами неравных мощностей, которых, естественно, не существует.

+0

@Slaks, похоже, не согласен – Ogen

+3

Это проблема HIS, а не моя. Я дал вам математически обоснованное доказательство того, что ответ «нет». Мне не нужно ТАКЖЕ указывать на недостаток в ответе @SLaks. В любом случае его ответ может быть или не быть «достаточно хорошим» для ваших целей, но это то, что я не могу сказать. –

+0

Я все еще пытаюсь понять ваш ответ. Например, если взять двоичную систему, основанную на множестве {0, 1} с мощностью 2. Любое слово из набора букв с мощностью 26 может быть однозначно представлено в двоичном виде, потому что 0 и 1 можно использовать любым количество раз. Разве это не противоречит вашему ответу? Потому что теперь у нас есть два набора с разными мощностями, где между ними нет биекции? – Ogen