Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java:使用位编码标记的存在_Java_Encoding_Bit - Fatal编程技术网

java:使用位编码标记的存在

java:使用位编码标记的存在,java,encoding,bit,Java,Encoding,Bit,我有一个类a,它最多可以有50个标记,a的实例在一个存储为json+压缩的列表(想想几十万)中多次出现。标记名称和值为自由格式文本,每个长度最多1024个字符。同一列表中不同标签的不同数量上限为50 目前,我不打算转移到其他类型的编码,比如protobuf或使用不同的压缩算法 为了减少存储数据的大小,我考虑使用位编码来捕获某些标记的存在。例如,在序列化数据之前,扫描一个标记名的实例列表,收集所有标记名:tagValue集,并按如下方式为每个不同的标记分配编号 1: tagA:valueA 2:

我有一个类a,它最多可以有50个标记,a的实例在一个存储为json+压缩的列表(想想几十万)中多次出现。标记名称和值为自由格式文本,每个长度最多1024个字符。同一列表中不同标签的不同数量上限为50

目前,我不打算转移到其他类型的编码,比如protobuf或使用不同的压缩算法

为了减少存储数据的大小,我考虑使用位编码来捕获某些标记的存在。例如,在序列化数据之前,扫描一个标记名的实例列表,收集所有标记名:tagValue集,并按如下方式为每个不同的标记分配编号

1: tagA:valueA
2: tagB:valueB
4: tagC:valueC
8: tagD:valueD
16: ...
每个实例都有表示位值的长字段,例如,如果A有tagA,tagC,tagD,它就有

long tagSet = 13; //(0001 | 0100 | 1000 = 13)
我还将维护一个字符串数组作为映射。这样,原始标记字符串就不会在每个实例中重复


有没有更好的方法来实现这一点,比如一些内置的java集合,甚至是完全不同的编码机制?

您知道编译时可能的标记的完整集合吗?在这种情况下,您可以将标记建模为枚举值,并使用
java.util.EnumSet
存储它们;枚举集在内部使用位。编译时不知道它