实现一个6位验证码,不能重复 , 验证码包含数字,汉字生成6位验证吗,输出在控制台,用户输入,判断对或错,不区分大小写
这是今天老师给的作业。分享下我的思路
先上 获取验证码的思路图:
- package cn.itcast;
- import java.util.Scanner;
- /*
- 实现一个6位验证码,不能重复 , 验证码包含数字,汉字
- 生成6位验证吗,输出在控制台,用户输入,判断对或错,不区分大小写
- 思路:
- 用查表法,字符数组,存储需要的字符 数字,字母,汉字
- 利用随机数,随机生成,随机数当作下标,数组找对应的字符
- 从数组中找到字符后,将字符存储到缓冲区(这里我用的是长为6的字符数组),
- 获取一个字符后,先别存到缓冲区,先看看缓冲区中是否存在这个字符,
- 如果不存在,存进去,如果存在,不要这个字符,继续下一次获取随机数
- 将获取到的字符,存储后,判断缓冲区长度,是6 break;
- */
- public class CodeTest {
-
- public static void main(String[] args) {
-
- System.out.print("验证码:");
- String s = CodeTest.getCode();
- System.out.println(s);
- Scanner sc = new Scanner(System.in);
- System.out.println("请输入验证码:");
- String str = sc.nextLine();
- while(true){
- if(compareCode(str, s)){
- System.out.println("验证成功,正在进入...");
- System.out.println("恭喜您进来了,但是并没有什么东西让你用~~~");
- break;
- }
- System.out.println("验证失败,请重新输入:");
- str = sc.nextLine();
- }
- }
- //获取生成验证码
- public static String getCode(){
- //定义一个字符串数组ch,储存随机数的的库。
- char[] ch = {'实','现','一','个','位','验','证','码','不','能','重','复',
- '1','2','3','4','5','6','7','8','9','0','a','b','c','d',
- 'e','f','g','h','i','g','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'};
- char[] code = new char[6];//定义长度为6的空字符数组用来存放生成的验证码
- int x = 0;
- tab:while ( x < 6 ) {
- double d = Math.random();
- int i = (int) (74 * d);
- // 进入循环判断生成的随机字符与之前的是否相等,从第二次生成随机数时开始。
- for (int j = 0; x > 0 && j < x ; j++) {
- if (code[x] == code[j]){
- break tab;
- }
- }
- code[x] = ch[i];//将生成的放入code中
- x++;
- }
- return String.valueOf(code);
- }
- //判断两个字符相等
- public static boolean compareCode(String str,String s){
- if(str.length() != 6){
- return false;
- }else {
- return str.equalsIgnoreCase(s);
- }
-
- }
-
- }
复制代码 整体可能有些地方不够高效,但这是目前我觉比较好的了。
|
|