【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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
2018-04-24 学习研究技术就该只问耕耘不问收获