要求:给一个字符串,从开始位每隔3位,移动下一位到字符结尾。例如:0123456789ABCDEF字符串,取出第0位,第4位,第8位。。。 移动到字符结尾,最好得到 1235679ABDEF048C,按照此规则编码后,要求给出解码过程。
package test;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
public class Test2 {
public static void main(String[] args) {
String oldString="0123456789ABCDEF";
StringBuffer sb=new StringBuffer();
Random r=new Random();
for(int i=0;i<100000;i++){
int randome=Math.abs(r.nextInt()%15);
sb.append(oldString.charAt(randome));
}
String j=oldString;
j=new String(sb);
System.out.println(used());
long start=System.currentTimeMillis();
// String jiema=assemble(j, 3);
//System.out.println(jiema);
//System.out.println(jiema(jiema, 3));
// jiema(jiema, 3);
long end=System.currentTimeMillis();
System.out.println("time lasts "+(end-start)+"ms");
System.out.println(used());
System.out.println("memory increased by "+(end-start)+"bytes");
}
public static String assemble(String str,int span){
java.util.ArrayList list=new ArrayList();
char[] chars=str.toCharArray();
for(int i=0;i
list.add(chars[i]);
}
for(int i=0;i
char newChar=chars[i];
list.set(i, null);
list.add(newChar);
//printList(list);
// System.out.println(newChar);
i=i+span;
}
StringBuffer sb=new StringBuffer(str.length());
for (Character c : list) {
if(c!=null)
sb.append(c);
}
return new String(sb);
}
private static void printList(List list){
for (Object object : list) {
System.out.print(object);
}
System.out.println();
}
private static String jiema(String str,int span){
int num=str.length()/span;
java.util.LinkedList list=new LinkedList();
char[] chars=str.toCharArray();
for(int i=0;i
list.add(chars[i]);
}
List list2=list.subList(list.size()-num-1, list.size());
//printList(list2);
Object[] mas= list2.toArray();
int step=0;
for(int i=0;i<=num;i++){
list.add((i*span),(Character) mas[i]);
}
StringBuffer sb=new StringBuffer(str.length());
int wei=0;
for (Character c : list) {
wei++;
if(wei<=str.length())
sb.append(c);
}
return new String(sb);
}
public static long used()
{
long total=Runtime.getRuntime().totalMemory();
long free=Runtime.getRuntime().freeMemory();
return (total-free);
}
}
解析:
* 一个解码函数一个编码函数可以确定字符串和分割长度。
* used 函数检测程序开始和结尾的内存使用情况,用时间函数检测程序运行时间状况。
* Random 函数获取随机数来初始化原始字符串,不要加种子,加种子后每次获取的随机数是一样的。
* 编码时因为查找操作比较多,所以选择arrayList ,解码时插入操作比较多,所以选择LinkList
思考:
1. 当字符串长度超过10000后,速度很慢,这其实也是一个大量数组操作问题,如果有这么多数据,又涉及到循环遍历和移动时该如何处理?重新规划数 据结构么?
转载自我的网站:http://itrblog.info