群里有朋友提出的问题:
功能
生成随机密码串;
要求
密码串类型可以是纯数字,纯字符,或混合数字、字符和其他符号。
密码串类型和密码串长度在运行时指定。
生成密码串的个数在运行时指定。
看到群里没人贴完整功能的代码,可能是对此题不屑一顾,于是自己就帮忙写了。(初学者可以参考下)
/*
* assignType方法控制密码串的类型,str存放的是密码串中可能存在的字符
*/
package com.yby;
public class StrType {
public static String assignType(int type){
String str="";
while(true){
switch(type){
case 1:
for(int i=0;i<=9;i++){ //纯数字
str=str+i;
}
return str;
case 2:
for(int i=33;i<127;i++){
if(i<58&&i>47){ //排除数字
continue;
}
str=(char)i+str;
System.out.println(str);
}
return str;
case 3:
for(int i=33;i<127;i++){ //数字和字符混合
str=(char)i+str;
}
return str;
default:
System.out.println("输入错误,程序退出!");
System.exit(1);
}
}
}
}
=========================================
/*
* 得到密码串
*/
package com.yby;
import java.util.Random;
public class GetPwd {
public static String getpass(String str, int length) {
String pwd = "";
Random rand = new Random();
char[] chr = str.toCharArray();
for (int i = 0; i < length; i++) { // 控制密码的长度
int j = rand.nextInt(chr.length); // 随机产生字符数组下标
pwd = pwd + chr[j];
}
return pwd;
}
}
=========================================
/*
* 得到密码串数组
*/
package com.yby;
public class StrPwd {
public static String[] strPwd(String str, int length,int num){
String[] strpwd= new String[num];
for(int i=0;i<num;i++){
String pwd=GetPwd.getpass(str, length);
strpwd[i]=pwd;
}
return strpwd;
}
}
=========================================
/*
* 打印产生的密码串
*/
package com.yby;
public class printPwd {
public static void printpass(String[] pwd){
for(int i=0;i<pwd.length;i++){
System.out.println(pwd[i]);
}
}
}
=========================================
/*
* 测试类
*/
package com.yby.test;
import java.util.Scanner;
import com.yby.GetPwd;
import com.yby.StrPwd;
import com.yby.StrType;
import com.yby.printPwd;
public class Test {
public static void main(String[] args) {
Scanner output = new Scanner(System.in);
System.out.println("请输入密码串的类型(1.纯数字 2.纯字符 3.混合数字、字符和其他符号)");
int type = output.nextInt();
String str = StrType.assignType(type);
System.out.println("请输入密码长度:");
int length = output.nextInt();
String pwd = GetPwd.getpass(str, length);
System.out.println("请输入要产生的密码串个数:");
int num = output.nextInt();
String strpwd[] = StrPwd.strPwd(pwd, length, num);
// 打印
printPwd.printpass(strpwd);
}
}
另外一种方法:
就是把需要的字符全部放在一个字符数组中,再在字符数组中随机取出字符组成密码串。此方法的好处就是想要什么特殊字符,自己添加,后面的代码作只需少许改动。
/*自己写测试类测试下
package test;
import java.util.Random;
public class Getpass {
private static char[] chars = { '0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k',
'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x',
'y', 'z', 'A', 'B','C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L',
'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y',
'Z','!','@','#','$','%','^','&','*','~','|'}; //72个字符集
/**
*
* @param passLength
* 随机密码长度
* @param count
* 随机密码个数
* @return 随机密码数组
*/
public static String[] getPasswords(int type,int passLength, int count) {
String[] passwords = new String[count];// 新建一个长度为指定需要密码个数的字符串数组
Random random = new Random();
if(type==1){
for (int i = 0; i < count; i++) {// 外循环 从0开始为密码数组赋值 也就是开始一个一个的生成密码
StringBuilder password = new StringBuilder("");// 保存生成密码的变量
for (int m = 1; m <= passLength; m++) {// 内循环 从1开始到密码长度 正式开始生成密码
password.append(chars[random.nextInt(10)]);// 为密码变量随机增加上面字符中的一个
}
passwords[i] = password.toString();// 将生成出来的密码赋值给密码数组
}
}
else if(type==2){
for (int i = 0; i < count; i++) {// 外循环 从0开始为密码数组赋值 也就是开始一个一个的生成密码
StringBuilder password = new StringBuilder("");// 保存生成密码的变量
for (int m = 1; m <= passLength; m++) {// 内循环 从1开始到密码长度 正式开始生成密码
password.append(chars[random.nextInt(53)+10]);// 为密码变量随机增加上面字符中的一个
}
passwords[i] = password.toString();// 将生成出来的密码赋值给密码数组
}
}
else if(type==3){
for (int i = 0; i < count; i++) {// 外循环 从0开始为密码数组赋值 也就是开始一个一个的生成密码
StringBuilder password = new StringBuilder("");// 保存生成密码的变量
for (int m = 1; m <= passLength; m++) {// 内循环 从1开始到密码长度 正式开始生成密码
password.append(chars[random.nextInt(72)]);// 为密码变量随机增加上面字符中的一个
}
passwords[i] = password.toString();// 将生成出来的密码赋值给密码数组
}
}
else{
System.out.println("输入错误!");
}
return passwords;
}
}
重复的代码最好建一个类,要不然看着就刺眼。