#java #string
#java #строка
Вопрос:
Это может показаться глупым, но мне все равно интересно…
Возможно ли взять строку, состоящую из заданного набора символов, и сжать ее, используя больший набор символов, или преобразовать ее в число, а затем преобразовать обратно в единицу?
Например, если у вас есть строка, из которой вы знаете, из чего она должна состоять [a-z][A-Z][0-9]-_ =
, не могли бы вы преобразовать ее в число, поменять местами, используя больше символов, чтобы сжать ее?
Это область, с которой я не знаком, я все еще хочу сохранить ее в виде строки, только более короткой. (для отображения / эха / etc, а не для памяти)
Комментарии:
1. Я не совсем понимаю, что вы подразумеваете под «сжатием», я полагаю. Вы хотите, чтобы она занимала меньше физического места в памяти или меньше визуального пространства на дисплее? В первом случае, я полагаю, будет работать любая библиотека сжатия. Если последнее, может быть, что-то вроде кодировки base64?
2. Любой приличный алгоритм сжатия делает намного больше этого более эффективным способом (например, huffman coding присваивает более короткие коды для более частых символов). Многие из них (опять же, кодирование Хаффмана является хорошим примером) относительно просты. Но даже это почти никогда не стоит того. С каким объемом данных вы имеете дело?
3. теоретически, меня беспокоит не строка короче 100 символов; память / etc — это не то, о чем я беспокоюсь, а фактическая длина символа с использованием той же кодировки (utf-8 или любая другая подходящая терминология)… На данный момент это в основном академический подход, но я мог бы увидеть некоторые практические применения, если это сработает. Я просто мало что знаю об этом предмете.
4. (Через пару лет) Также взгляните на JEP 254 в openjdk.java.net/jeps/254
Ответ №1:
Я бы не стал утруждать себя этим, если только строка не огромная. Затем вы можете попытаться сжать ее с помощью commons-compress или java.util.zip
Ответ №2:
Строка внутри хранит массив из 16 битных символов, что для западноевропейских языков является пустой тратой времени, вы можете преобразовать в utf-8, что должно дать вам сокращение на 50%, выполнив
String myString = .....
ByteArrayOutputStream baos = new ByteArrayOutputStream();
baos.write(myString.getBytes("UTF-8");
byte[] data = baos.toByteArray();
и сохранить ее в виде массива байтов.
Конечно, это довольно неудобно, если вы действительно хотите использовать их как строки, но если речь идет о долговременном хранении без особого доступа, это сэкономило бы вам кучу денег.
Вам пришлось бы сделать обратное, чтобы воссоздать строку.
Ответ №3:
String — это примитивный тип, вам вряд ли удастся освободить место путем преобразования, если вы не используете zip-библиотеку Java, и даже это не даст преимуществ в производительности, которые вы предположительно ищете.
Комментарии:
1. На самом деле я не пытаюсь повысить производительность, это произошло потому, что я пытался втиснуть ~ 50 символов в элемент со значением описания (сокращая длинную историю) в игре, чтобы он соответствовал; идея состояла в том, чтобы скрыть сообщения в преобразованной строке, а не создавать хэш или что-то в этом роде и скрывать реальную строку в качестве данных об элементе. Таким образом, игроки могли бы взять строку и скопировать ее, чтобы поделиться ею с другими. (вне игры или с помощью других средств)
2. String не является примитивным типом в Java.