All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.moon.core.util.RandomStringUtil Maven / Gradle / Ivy

package com.moon.core.util;

import com.moon.core.enums.Const;
import com.moon.core.lang.StringUtil;

import static com.moon.core.lang.ThrowUtil.noInstanceError;
import static com.moon.core.util.RandomUtil.nextBoolean;
import static com.moon.core.util.RandomUtil.nextInt;

/**
 * @author moonsky
 */
public final class RandomStringUtil {

    private RandomStringUtil() {
        noInstanceError();
    }

    /*
     * -------------------------------------------------------------------
     * chinese 汉字
     * -------------------------------------------------------------------
     */

    public static char nextChineseChar() {
        return (char) nextInt(0x4e00, 0x9fa6);
    }

    public static String nextChinese() {
        return nextChinese(nextInt(99));
    }

    public static String nextChinese(int length) {
        if (length > 0) {
            char[] value = new char[length];
            for (int i = 0; i < length; i++) {
                value[i] = nextChineseChar();
            }
            return new String(value);
        }
        return Const.EMPTY;
    }

    public static String nextChinese(int min, int max) {
        ValidateUtil.requireGeOf(min, 0);
        ValidateUtil.requireLeOf(min, max);
        return nextChinese(nextInt(min, max));
    }

    /*
     * -------------------------------------------------------------------
     * upper 大写字母
     * -------------------------------------------------------------------
     */

    public static char nextUpperChar() {
        return (char) nextInt(65, 91);
    }

    public static String nextUpper() {
        return nextUpper(nextInt(99));
    }

    public static String nextUpper(int length) {
        if (length > 0) {
            char[] value = new char[length];
            for (int i = 0; i < length; i++) {
                value[i] = nextUpperChar();
            }
            return new String(value);
        }
        return Const.EMPTY;
    }

    public static String nextUpper(int min, int max) {
        ValidateUtil.requireGeOf(min, 0);
        ValidateUtil.requireLeOf(min, max);
        return nextUpper(nextInt(min, max));
    }

    /*
     * -------------------------------------------------------------------
     * lower 小写字母
     * -------------------------------------------------------------------
     */

    public static char nextLowerChar() {
        return (char) nextInt(97, 123);
    }

    public static String nextLower() {
        return nextLower(nextInt(99));
    }

    public static String nextLower(int length) {
        if (length > 0) {
            char[] value = new char[length];
            for (int i = 0; i < length; i++) {
                value[i] = nextLowerChar();
            }
            return new String(value);
        }
        return Const.EMPTY;
    }

    public static String nextLower(int min, int max) {
        ValidateUtil.requireGeOf(min, 0);
        ValidateUtil.requireLeOf(min, max);
        return nextLower(nextInt(min, max));
    }

    /*
     * -------------------------------------------------------------------
     * letter 大小写字母
     * -------------------------------------------------------------------
     */

    public static char nextLetterChar() {
        return nextBoolean() ? nextUpperChar() : nextLowerChar();
    }

    public static String nextLetter() {
        return nextLetter(nextInt(99));
    }

    public static String nextLetter(int length) {
        if (length > 0) {
            char[] value = new char[length];
            for (int i = 0; i < length; i++) {
                value[i] = nextLetterChar();
            }
            return new String(value);
        }
        return Const.EMPTY;
    }

    public static String nextLetter(int min, int max) {
        ValidateUtil.requireGeOf(min, 0);
        ValidateUtil.requireLeOf(min, max);
        return nextLetter(nextInt(min, max));
    }

    /*
     * -------------------------------------------------------------------
     * control 控制字符
     * -------------------------------------------------------------------
     */

    public static char nextControlChar() {
        return (char) nextInt(0, 32);
    }

    public static String nextControl() {
        return nextControl(nextInt(99));
    }

    public static String nextControl(int length) {
        if (length > 0) {
            char[] value = new char[length];
            for (int i = 0; i < length; i++) {
                value[i] = nextControlChar();
            }
            return new String(value);
        }
        return Const.EMPTY;
    }

    public static String nextControl(int min, int max) {
        ValidateUtil.requireGeOf(min, 0);
        ValidateUtil.requireLeOf(min, max);
        return nextControl(nextInt(min, max));
    }

    /*
     * -------------------------------------------------------------------
     * digit 数字
     * -------------------------------------------------------------------
     */

    public static char nextDigitChar() {
        return (char) nextInt(48, 58);
    }

    public static String nextDigit() {
        return nextDigit(nextInt(99));
    }

    public static String nextDigit(int length) {
        if (length > 0) {
            char[] value = new char[length];
            for (int i = 0; i < length; i++) {
                value[i] = nextDigitChar();
            }
            return new String(value);
        }
        return Const.EMPTY;
    }

    public static String nextDigit(int min, int max) {
        ValidateUtil.requireGeOf(min, 0);
        ValidateUtil.requireLeOf(min, max);
        return nextDigit(nextInt(min, max));
    }

    /*
     * -------------------------------------------------------------------
     * Symbol 运算符
     * -------------------------------------------------------------------
     */

    private static char[] SYMBOLS = "!@#$%^&*()_-+={}[]:;\"'|\\<>,.?/~`".toCharArray();

    public static char nextSymbolChar() {
        return SYMBOLS[nextInt(0, SYMBOLS.length)];
    }

    public static String nextSymbol() {
        return nextSymbol(nextInt(99));
    }

    public static String nextSymbol(int length) {
        if (length > 0) {
            char[] value = new char[length];
            for (int i = 0; i < length; i++) {
                value[i] = nextSymbolChar();
            }
            return new String(value);
        }
        return Const.EMPTY;
    }

    public static String nextSymbol(int min, int max) {
        ValidateUtil.requireGeOf(min, 0);
        ValidateUtil.requireLeOf(min, max);
        return nextSymbol(nextInt(min, max));
    }

    /*
     * -------------------------------------------------------------------
     * all char
     * -------------------------------------------------------------------
     */

    public static char nextChar() {
        switch (nextInt() % 3) {
            case 0:
                return nextLowerChar();
            case 1:
                return nextUpperChar();
            default:
                return nextDigitChar();
        }
    }

    public static String next() {
        return next(nextInt(99));
    }

    public static String next(int length) {
        if (length > 0) {
            char[] value = new char[length];
            for (int i = 0; i < length; i++) {
                value[i] = nextChar();
            }
            return new String(value);
        }
        return Const.EMPTY;
    }

    public static String next(int min, int max) {
        ValidateUtil.requireGeOf(min, 0);
        ValidateUtil.requireLeOf(min, max);
        return next(nextInt(min, max));
    }

    public static char nextChar(boolean lower, boolean upper, boolean digit) {
        int value = lower ? (upper ? (digit ? nextChar() : nextLetterChar())
            : (digit ? (nextBoolean() ? nextDigitChar() : nextLowerChar()) : nextLowerChar()))
            : (upper ? (digit ? (nextBoolean() ? nextDigitChar() : nextUpperChar()) : nextUpperChar())
                : (digit ? nextDigitChar() : -1));
        return value < 0 ? nextChar() : (char) value;
    }

    public static String next(int length, boolean lower, boolean upper, boolean digit) {
        if (length > 0) {
            char[] chars = new char[length];
            for (int i = 0; i < length; i++) {
                chars[i] = nextChar(lower, upper, digit);
            }
            return new String(chars);
        }
        return Const.EMPTY;
    }

    public static String next(int min, int max, boolean lower, boolean upper, boolean digit) {
        ValidateUtil.requireGeOf(min, 0);
        ValidateUtil.requireLeOf(min, max);
        return next(nextInt(min, max), lower, upper, digit);
    }

    /**
     * 返回指定长度随机字符串
     * 字符串的字符来自于 src
     *
     * @param src    源字符串
     * @param length 生成的追击字符串长度
     *
     * @return 追击字符串
     */
    public static String random(String src, int length) {
        int ln = src == null ? 0 : src.length();
        if (length > 0 && ln > 0) {
            char[] chars = StringUtil.toCharArray(src);
            char[] value = new char[length];
            for (int i = 0; i < length; i++) {
                value[i] = chars[nextInt(ln)];
            }
            return new String(value);
        }
        return Const.EMPTY;
    }

    /*
     * -------------------------------------------------------------------
     * random
     * -------------------------------------------------------------------
     */


    /**
     * 返回于指定最大长度和最小长度之间长度的随机字符串
     * 字符串的字符来自于 src
     *
     * @param src 字符源
     * @param min 最小长度
     * @param max 最大长度
     *
     * @return 随机字符串
     */
    public static String random(String src, int min, int max) { return random(src, nextInt(min, max)); }

    /**
     * 字符串乱序
     *
     * @param str 原始字符串
     *
     * @return 乱序后的字符串
     */
    public static String randomOrder(String str) {
        if (str != null) {
            int i = 0, len = str.length();
            Character[] chars = new Character[len];
            for (; i < len; i++) {
                chars[i] = str.charAt(i);
            }
            RandomUtil.randomOrder(chars);
            char[] value = new char[len];
            for (i = 0; i < len; i++) {
                value[i] = chars[i];
            }
            str = new String(value);
        }
        return str;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy