ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

随机字符串工具类

2022-06-09 15:32:14  阅读:107  来源: 互联网

标签:int CHAR length static 随机 字符串 new 工具 public


示例代码:

import java.io.UnsupportedEncodingException;
import java.security.SecureRandom;
import java.util.*;

/**
 * 随机生成字符串
 */
public final class RandomStringUtil {
    /**
     * 2021年姓排行100
     */
    private final static String[] SURNAME = {
            "李", "王", "张", "刘", "陈",
            "杨", "赵", "黄", "周", "吴",
            "徐", "孙", "胡", "朱", "高",
            "林", "何", "郭", "马", "罗",
            "梁", "宋", "郑", "谢", "韩",
            "唐", "冯", "于", "董", "萧",
            "程", "曹", "袁", "邓", "许",
            "傅", "沈", "曾", "彭", "吕",
            "苏", "卢", "蒋", "蔡", "贾",
            "丁", "魏", "薛", "叶", "阎",
            "余", "潘", "杜", "戴", "夏",
            "钟", "汪", "田", "任", "姜",
            "范", "方", "石", "姚", "谭",
            "廖", "邹", "熊", "金", "陆",
            "郝", "孔", "白", "崔", "康",
            "毛", "邱", "秦", "江", "史",
            "顾", "侯", "邵", "孟", "龙",
            "万", "段", "漕", "钱", "汤",
            "尹", "黎", "易", "常", "武",
            "乔", "贺", "赖", "龚", "文"};

    private static final char LOWER_CHAR[] = {'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'};
    private static final char UPPER_CHAR[] = {'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'};
    private static final char NUMBER_CHAR[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
    public static final int MULTIPLE = 0;// 所有字符
    public static final int LOWER = 1;// 只包含小写字母
    public static final int UPPER = 2;// 只包含大写字母
    public static final int NUMBER = 3;// 只包含数字
    public static final int LOWER_AND_UPPER = 4;// 包含大小写字母
    public static final int LOWER_AND_NUMBER = 5;// 包含小写字母和数字
    public static final int UPPER_AND_NUMBER = 6;// 包含大写字母和数字

    /**
     * 随机获取姓名
     *
     * @return
     */
    public static String fullName() {
        return surname() + name(2);
    }

    /**
     * 拼接字符数组
     */
    public static char[] concat(char[]... a) {
        LinkedList<Character> list = new LinkedList<>();
        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < a[i].length; j++) {
                list.add(a[i][j]);
            }
        }
        char result[] = new char[list.size()];
        Iterator<Character> it = list.iterator();
        for (int i = 0, length = result.length; i < length; i++) {
            result[i] = it.next();
        }
        return result;
    }

    /**
     * 获取随机字符串,包含大小写字母和数字,可以有重复字符
     *
     * @param length 字符串长度
     */
    public String getRandomString(int length) {
        return getRandomString(length, MULTIPLE, true);
    }

    /**
     * 获取随机字符串,可以有重复字符
     *
     * @param length     字符串长度
     * @param randomType 随机字符的类型
     */
    public String getRandomString(int length, int randomType) {
        return getRandomString(length, randomType, true);
    }

    /**
     * 获取随机字符串
     *
     * @param length     字符串长度
     * @param randomType 随机字符的类型
     * @param repeat     是否可以有重复字符,true表示可以重复,false表示不允许重复。如果length大于randomType库的长度,则默认采用true值。
     */
    public static String getRandomString(int length, int randomType, boolean repeat) {
        StringBuilder sb = new StringBuilder();
        char find[] = null;
        switch (randomType) {
            case LOWER:
                find = LOWER_CHAR;
                break;
            case UPPER:
                find = UPPER_CHAR;
                break;
            case NUMBER:
                find = NUMBER_CHAR;
                break;
            case MULTIPLE:
                find = concat(LOWER_CHAR, UPPER_CHAR, NUMBER_CHAR);
                break;
            case LOWER_AND_NUMBER:
                find = concat(LOWER_CHAR, NUMBER_CHAR);
                break;
            case UPPER_AND_NUMBER:
                find = concat(UPPER_CHAR, NUMBER_CHAR);
                break;
            case LOWER_AND_UPPER:
                find = concat(LOWER_CHAR, UPPER_CHAR);
                break;
        }
        if (length > find.length) {
            repeat = true;
        }
        final SecureRandom r = new SecureRandom();
        if (repeat) {
            for (int i = 0; i < length; i++) {
                sb.append(find[r.nextInt(find.length)]);
            }
        } else {
            HashSet<Integer> indexset = new HashSet<Integer>();
            for (int i = 0; i < length; i++) {
                int index = r.nextInt(find.length);
                while (indexset.contains(index)) {
                    index = r.nextInt(find.length);
                }
                sb.append(find[index]);
                indexset.add(index);
            }
        }
        return sb.toString();
    }

    /**
     * 获取随机字符串
     *
     * @param length 字符串长度
     * @param repeat 是否可以存在重复的字符
     * @param ch     自定义字符集
     */
    public static String getRandomString(int length, boolean repeat, char[]... ch) {
        List<Character> list = new LinkedList();
        for (char[] cs : ch) {
            for (char c : cs) {
                list.add(c);
            }
        }
        if (list.size() == 0) {
            return "";
        }
        if (length > list.size()) {
            repeat = true;
        }
        final SecureRandom r = new SecureRandom();
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < length; i++) {
            if (repeat) {
                sb.append(list.get(r.nextInt(list.size())));
            } else {
                sb.append(list.remove(r.nextInt(list.size())));
            }
        }
        return sb.toString();
    }


    /**
     * 随机获取姓
     *
     * @return
     */
    private static String surname() {
        return SURNAME[new Random().nextInt(SURNAME.length - 1)];
    }

    /**
     * 获取N位常用字
     *
     * @param len
     * @return
     */
    private static String name(int len) {
        StringBuilder ret = new StringBuilder();
        for (int i = 0; i < len; i++) {
            String str = null;
            // 定义高低位
            int highPos, lowPos;
            Random random = new Random();
            //获取高位值
            highPos = (176 + Math.abs(random.nextInt(39)));
            //获取低位值
            lowPos = (161 + Math.abs(random.nextInt(93)));
            byte[] b = new byte[2];
            b[0] = (new Integer(highPos).byteValue());
            b[1] = (new Integer(lowPos).byteValue());
            try {
                //转成中文
                str = new String(b, "GBK");
            } catch (UnsupportedEncodingException ex) {
                ex.printStackTrace();
            }
            ret.append(str);
        }
        return ret.toString();
    }

    public static void main(String[] args) {
        System.out.println(RandomStringUtil.fullName());
    }
}

 

标签:int,CHAR,length,static,随机,字符串,new,工具,public
来源: https://www.cnblogs.com/xfeiyun/p/16359467.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有