java字符串移动插入

要求:给一个字符串,从开始位每隔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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值