【Java】将字符串随机乱序的三函数
要将字符串乱序输出,一种思路是使用Collections.shuffle(),一种思路是自己写随机置换函数。
但将原文转列表也有开销,它和置换函数谁更快了,还是让实验说话。
经实践证明,凡是字符串操作能走char数组下标置换的的尽量走下标,转list用正则等效率就下去了。
代码如下:
package com.hy.lab.shuffle; import java.util.*; public class Test { // 低效 public static String shuffle1(String original){ List list = Arrays.asList(original.split("")); Collections.shuffle(list); StringBuilder sb=new StringBuilder(); list.forEach(item->sb.append(item)); return sb.toString(); } // 居中,约为shuffle1的一半时间 public static String shuffle2(String original){ List<Character> list=new ArrayList<>(); char[] arr=original.toCharArray(); for(char c:arr){ list.add(c); } Collections.shuffle(list); StringBuilder sb=new StringBuilder(); list.forEach(item->sb.append(item)); return sb.toString(); } // 高效,约为shuffle1的一成时间 public static String shuffle3(String original){ char[] arr=original.toCharArray(); Random rnd=new Random(); char tmp; int j; for(int i=arr.length;i>1;i--){ j=rnd.nextInt(i); tmp=arr[i-1]; arr[i-1]=arr[j]; arr[j]=tmp; } return String.valueOf(arr); } private static int rnd(int min,int max) { return (int)(min+Math.random()*(max-min+1)); } public static void main(String[] args){ System.out.println(shuffle1("abcdefghijklmnopqrstuvwxyz")); System.out.println(shuffle2("ABCDEFGHIJKLMNOPQRSTUVWXYZ")); System.out.println(shuffle3("0123456789")); long startMs=System.currentTimeMillis(); for(int i=0;i<100000;i++) { shuffle1("abcdefghijklmnopqrstuvwxyz"); } long endMs=System.currentTimeMillis(); System.out.println("shuffle耗时:"+ms2DHMS(startMs,endMs)); startMs=System.currentTimeMillis(); for(int i=0;i<100000;i++) { shuffle2("abcdefghijklmnopqrstuvwxyz"); } endMs=System.currentTimeMillis(); System.out.println("shuffle2耗时:"+ms2DHMS(startMs,endMs)); startMs=System.currentTimeMillis(); for(int i=0;i<100000;i++) { shuffle3("abcdefghijklmnopqrstuvwxyz"); } endMs=System.currentTimeMillis(); System.out.println("shuffle3耗时:"+ms2DHMS(startMs,endMs)); } private static String ms2DHMS(long startMs, long endMs) { String retval = null; long secondCount = (endMs - startMs) / 1000; String ms = (endMs - startMs) % 1000 + "ms"; long days = secondCount / (60 * 60 * 24); long hours = (secondCount % (60 * 60 * 24)) / (60 * 60); long minutes = (secondCount % (60 * 60)) / 60; long seconds = secondCount % 60; if (days > 0) { retval = days + "d" + hours + "h" + minutes + "m" + seconds + "s"; } else if (hours > 0) { retval = hours + "h" + minutes + "m" + seconds + "s"; } else if (minutes > 0) { retval = minutes + "m" + seconds + "s"; } else if(seconds > 0) { retval = seconds + "s"; }else { return ms; } return retval + ms; } }
输出:
irsyoanjucwfzxkvhelgpdbqtm RJECQGFPKNXTSVHOWDIMUBZAYL 4137960528 shuffle耗时:1s32ms shuffle2耗时:359ms shuffle3耗时:78ms
END