算法 怎样将类似"2297725","02456847"的数字字符串 变成一个5个长度的字符串 要可还原 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 可以相邻的两个数字作为一个字符的int值。例如:char char1 = (char)22;char char2 = (char)97;char char3 = (char)72;char char4 = (char)5;然后在组合成一个字符串。这样是可以压缩一下的,不知道你的数字字符串最大长度有没有限制。如果没有,那肯定无法实现。如果有限制,可以再考虑加一个奇偶位标志的char。细节就不说了,原则上是可以实现的。 用进制压缩不是很完美,毕竟5位长度,表示的数据有限,除非数据有规定最大限度for exampleimport java.util.*;public class Test { public static void main(String[] args) throws Throwable { String base = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; //用于进制表示 char[] key = base.toCharArray(); int dig = base.length(); System.out.printf("max length:%d\n", (long)Math.pow(dig, 4)); //最大能表示的数 String[] code = {"2297725","02456847"};//原始测试数据 System.out.println("----------original code----------"); System.out.println(Arrays.toString(code)); StringBuilder buf = new StringBuilder(); System.out.println("----------encode----------"); String[] encode = new String[code.length]; for (int i=0; i<code.length; i++) { //用进制的方式压缩 buf.delete(0, buf.length()); int n = Integer.valueOf(code[i]); while (n > 0) { buf.insert(0, key[n%dig]); n /= dig; } buf.insert(0, key[code[i].length()%dig]); //前一位表示原始数据长度,因为考虑原始数据开头是0的情况 encode[i] = buf.toString(); } System.out.println(Arrays.toString(encode)); System.out.println("----------decode----------"); String[] decode = new String[encode.length]; for (int i=0; i<encode.length; i++) { //解压数据,用进制换算回来 buf.delete(0, buf.length()); char[] c = encode[i].toCharArray(); int len = base.indexOf(c[0]); //先获取原始数据的长度 int sum = 0; for (int j=1; j<c.length; j++) { //再按进制换算回来 sum = sum*dig + base.indexOf(c[j]); } buf.append(sum); for (int j=0; j<len-buf.length(); j++) { buf.insert(0, "0"); } decode[i] = buf.toString(); } System.out.println(Arrays.toString(decode)); }} 你应该先把用途说明白了,如果转换后的字符串是用来保存的,只要没超过int类型变量的上限值,就可以只用4个字节保存。你转换后的字符串到底干嘛用的? 求解struts1中action向jsp传值问题 请教一个JDBC连接数据库的问题 spring2.5+hibernate配置文件事务管理的写法 弱弱的问一下:用hibernate中的criteria怎么按月排序? 为什么我创建的JMS服务,别的计算机无法连接? 如何集成其他系统的登录 eclipse配置struts插件时的困惑 java客户端程序程序 操作xml,打印(,急需帮忙,非常感谢,挺急的我) 用hibernate无法插入对象到oracle数据库 jbuilder7+jboss的配置问题? cxf的高手们,如何获取ip地址啊? jbpm 流程定义(数据库创建)
例如:
char char1 = (char)22;
char char2 = (char)97;
char char3 = (char)72;
char char4 = (char)5;
然后在组合成一个字符串。
这样是可以压缩一下的,不知道你的数字字符串最大长度有没有限制。如果没有,那肯定无法实现。
如果有限制,可以再考虑加一个奇偶位标志的char。细节就不说了,原则上是可以实现的。
for example
import java.util.*;
public class Test {
public static void main(String[] args) throws Throwable {
String base = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; //用于进制表示
char[] key = base.toCharArray();
int dig = base.length();
System.out.printf("max length:%d\n", (long)Math.pow(dig, 4)); //最大能表示的数
String[] code = {"2297725","02456847"};//原始测试数据
System.out.println("----------original code----------");
System.out.println(Arrays.toString(code));
StringBuilder buf = new StringBuilder();
System.out.println("----------encode----------");
String[] encode = new String[code.length];
for (int i=0; i<code.length; i++) { //用进制的方式压缩
buf.delete(0, buf.length());
int n = Integer.valueOf(code[i]);
while (n > 0) {
buf.insert(0, key[n%dig]);
n /= dig;
}
buf.insert(0, key[code[i].length()%dig]); //前一位表示原始数据长度,因为考虑原始数据开头是0的情况
encode[i] = buf.toString();
}
System.out.println(Arrays.toString(encode));
System.out.println("----------decode----------");
String[] decode = new String[encode.length];
for (int i=0; i<encode.length; i++) { //解压数据,用进制换算回来
buf.delete(0, buf.length());
char[] c = encode[i].toCharArray();
int len = base.indexOf(c[0]); //先获取原始数据的长度
int sum = 0;
for (int j=1; j<c.length; j++) { //再按进制换算回来
sum = sum*dig + base.indexOf(c[j]);
}
buf.append(sum);
for (int j=0; j<len-buf.length(); j++) {
buf.insert(0, "0");
}
decode[i] = buf.toString();
}
System.out.println(Arrays.toString(decode));
}
}