字符串压缩 java_如何在Java中压缩字符串?
如何在Java中壓縮字符串?
我使用GZIPOutputStream或ZIPOutputStream壓縮字符串(我的2222235278130938882小于20),但壓縮結(jié)果比原始字符串長(zhǎng)。
在某個(gè)站點(diǎn)上,我發(fā)現(xiàn)一些朋友說這是因?yàn)槲业脑甲址?#xff0c;因此可以使用GZIPOutputStream壓縮更長(zhǎng)的字符串。
因此,有人可以幫我壓縮字符串嗎?
我的功能是這樣的:
String compress(String original) throws Exception {
}
更新:
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.GZIPOutputStream;
import java.util.zip.*;
//ZipUtil
public class ZipUtil {
public static String compress(String str) {
if (str == null || str.length() == 0) {
return str;
}
ByteArrayOutputStream out = new ByteArrayOutputStream();
GZIPOutputStream gzip = new GZIPOutputStream(out);
gzip.write(str.getBytes());
gzip.close();
return out.toString("ISO-8859-1");
}
public static void main(String[] args) throws IOException {
String string = "admin";
System.out.println("after compress:");
System.out.println(ZipUtil.compress(string));
}
}
結(jié)果是:
11個(gè)解決方案
38 votes
壓縮算法幾乎總是具有某種形式的空間開銷,這意味著它們僅在壓縮足夠大以至于開銷小于節(jié)省的空間量的數(shù)據(jù)時(shí)才有效。
壓縮僅20個(gè)字符長(zhǎng)的字符串并不是一件容易的事,而且并非總是可能的。 如果有重復(fù),霍夫曼編碼或簡(jiǎn)單的行程編碼可能可以壓縮,但可能壓縮得很少。
JesperE answered 2020-01-28T07:13:27Z
9 votes
創(chuàng)建字符串時(shí),可以將其視為char的列表,這意味著對(duì)于String中的每個(gè)字符,您需要支持char的所有可能值。 來自太陽(yáng)的文檔
char:char數(shù)據(jù)類型是單個(gè)16位Unicode字符。 它的最小值為'\ u0000'(或0),最大值為'\ uffff'(或65,535(含))。
如果要支持的字符集減少了,可以編寫一個(gè)簡(jiǎn)單的壓縮算法,類似于二進(jìn)制->小數(shù)->十六進(jìn)制基數(shù)轉(zhuǎn)換。 您從65,536(或目標(biāo)系統(tǒng)支持的許多字符)到26(字母)/ 36(字母數(shù)字)等。
我已經(jīng)使用過幾次這個(gè)技巧,例如將時(shí)間戳記編碼為文本(目標(biāo)36 +,源10)-請(qǐng)確保您有足夠的單元測(cè)試!
Jon Freedman answered 2020-01-28T07:14:02Z
8 votes
如果密碼或多或少是“隨機(jī)的”,那么您就不走運(yùn)了,您將無法大幅度減小密碼的大小。
但是:為什么您需要壓縮密碼? 也許您需要的不是壓縮,而是某種哈希值? 如果僅需要檢查名稱是否與給定密碼匹配,則無需保存密碼,但可以保存密碼的哈希值。 要檢查鍵入的密碼是否與給定名稱匹配,您可以用相同的方式構(gòu)建哈希值,并將其與保存的哈希值進(jìn)行比較。 由于哈希(Object.hashCode())是一個(gè)int,您將能夠以80個(gè)字節(jié)存儲(chǔ)所有20個(gè)密碼哈希)。
Arne Deutsch answered 2020-01-28T07:14:28Z
6 votes
你的朋友是正確的。 gzip和ZIP均基于DEFLATE。 這是一種通用算法,并不旨在編碼小字符串。
如果需要,可能的解決方案是自定義編碼和解碼HashMap。這可以讓您進(jìn)行簡(jiǎn)單的一對(duì)一映射:
HashMap toCompressed, toUncompressed;
String compressed = toCompressed.get(uncompressed);
// ...
String uncompressed = toUncompressed.get(compressed);
顯然,這需要進(jìn)行設(shè)置,并且僅適用于少量的字符串。
Matthew Flaschen answered 2020-01-28T07:14:57Z
4 votes
霍夫曼編碼可能會(huì)有所幫助,但前提是您的小字符串中有很多常用字符
Noel M answered 2020-01-28T07:15:18Z
4 votes
ZIP算法是LZW和霍夫曼樹的組合。 您可以單獨(dú)使用這些算法之一。
壓縮基于兩個(gè)因素:
原始鏈(LZW)中子字符串的重復(fù):如果重復(fù)很多,壓縮將非常有效。 該算法具有壓縮長(zhǎng)文本的良好性能,因?yàn)閱卧~經(jīng)常被重復(fù)
壓縮鏈中每個(gè)字符的數(shù)量(霍夫曼):字符之間的重分配越不平衡,壓縮效率越高
在您的情況下,您應(yīng)該只嘗試LZW算法。 基本上可以使用此鏈,而無需添加元信息即可對(duì)其進(jìn)行壓縮:對(duì)于短字符串壓縮而言,它可能會(huì)更好。
對(duì)于霍夫曼算法,編碼樹必須與壓縮文本一起發(fā)送。 因此,由于樹的緣故,對(duì)于小的文本,結(jié)果可能大于原始文本。
Benoit Courtine answered 2020-01-28T07:16:01Z
4 votes
在此,霍夫曼編碼是一個(gè)明智的選擇。 Gzip和朋友可以這樣做,但是他們的工作方式是為輸入構(gòu)建霍夫曼樹,發(fā)送該樹,然后發(fā)送使用該樹編碼的數(shù)據(jù)。 如果樹相對(duì)于數(shù)據(jù)而言較大,則可能不會(huì)不節(jié)省任何大小。
但是,可以避免發(fā)送一棵樹:相反,您安排發(fā)送者和接收者已經(jīng)有一棵樹。 并不是專門針對(duì)每個(gè)字符串構(gòu)建的,但是您可以使用一個(gè)全局樹來編碼所有字符串。 如果您使用與輸入字符串相同的語(yǔ)言(英語(yǔ)或其他語(yǔ)言)來構(gòu)建它,則盡管每個(gè)輸入的自定義樹效果都不如自定義樹,但仍應(yīng)獲得良好的壓縮效果。
Tom Anderson answered 2020-01-28T07:16:28Z
2 votes
如果您知道您的字符串主要是ASCII,則可以將它們轉(zhuǎn)換為UTF-8。
byte[] bytes = string.getBytes("UTF-8");
這樣可以將內(nèi)存大小減少約50%。 但是,您將得到一個(gè)字節(jié)數(shù)組而不是一個(gè)字符串。 但是,如果將其寫入文件,那應(yīng)該不是問題。
轉(zhuǎn)換回字符串:
private final Charset UTF8_CHARSET = Charset.forName("UTF-8");
...
String s = new String(bytes, UTF8_CHARSET);
rghome answered 2020-01-28T07:17:03Z
0 votes
您沒有看到String發(fā)生任何壓縮,因?yàn)槟辽傩枰獢?shù)百個(gè)字節(jié)才能使用GZIPOutputStream或ZIPOutputStream進(jìn)行真正的壓縮。 您的字符串太小。(我不明白為什么您需要對(duì)其進(jìn)行壓縮)
檢查本文的結(jié)論:
本文還展示了如何壓縮?? 并即時(shí)解壓縮數(shù)據(jù)?? 為了減少網(wǎng)絡(luò)流量和?? 改善您的表現(xiàn)?? 客戶端/服務(wù)器應(yīng)用程序。?? 即時(shí)壓縮數(shù)據(jù),?? 提高性能?? 客戶端/服務(wù)器應(yīng)用程序僅在?? 被壓縮的對(duì)象更多?? 超過幾百個(gè)字節(jié)。 您?? 將無法觀察?? 如果性能改善?? 對(duì)象被壓縮?? 傳輸?shù)氖呛?jiǎn)單的String對(duì)象,?? 例如。
YoK answered 2020-01-28T07:17:34Z
0 votes
看看霍夫曼算法。
[https://codereview.stackexchange.com/questions/44473/huffman-code-implementation]
想法是,每個(gè)字符都將替換為位序列,具體取決于它們?cè)谖谋局械某霈F(xiàn)頻率(頻率越高,序列越小)。
您可以閱讀全文并建立一個(gè)代碼表,例如:
代號(hào)
0
s 10
e 110
m 111
該算法基于文本輸入構(gòu)建符號(hào)樹。 字符種類越多,壓縮效果越差。
但是,取決于您的文字,它可能是有效的。
live-love answered 2020-01-28T07:18:38Z
0 votes
Java 9可直接使用緊湊的字符串增強(qiáng)功能[https://openjdk.java.net/jeps/254]
java.lang.String現(xiàn)在具有:
私有最終字節(jié)[]值;
Anurag Sharma answered 2020-01-28T07:19:06Z
總結(jié)
以上是生活随笔為你收集整理的字符串压缩 java_如何在Java中压缩字符串?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 镜头畸变现象及其校正方法
- 下一篇: 工业级百兆5口交换机HY5700-450