0

我正在开发一个 android 应用程序 (Java),我需要一个字符串生成器。我不知道如何使允许的字符启用和禁用它们。Normaly 你会写这个代码:

    private static final String CHAR_LOWER = "abcdefghijklmnopqrstuvwxyz";
    private static final String CHAR_UPPER = CHAR_LOWER.toUpperCase();
    private static final String NUMBER = "0123456789";

    private static final String DATA_FOR_RANDOM_STRING = CHAR_LOWER + CHAR_UPPER + NUMBER;
    private static SecureRandom random = new SecureRandom();

    public static void main(String[] args) {

        for (int i = 0; i < 1; i++) {
            System.out.println(generateRandomString(10));
        }

    }

    public static String generateRandomString(int length) {
        if (length < 1) throw new IllegalArgumentException();

        StringBuilder sb = new StringBuilder(length);
        for (int i = 0; i < length; i++) {
            
            int rndCharAt = random.nextInt(DATA_FOR_RANDOM_STRING.length());
            char rndChar = DATA_FOR_RANDOM_STRING.charAt(rndCharAt);

            sb.append(rndChar);

        }

        return sb.toString();

}

,但是您不能使用例如开关来更改允许的字符。我怎样才能做到这一点?

4

2 回答 2

0
  1. 添加符号字符串(从中选择随机字符)作为方法的输入generateRandomString(int len, String DataChars)。并更改代码generateRandomString以使用DataChars.
  2. 您可以generateRandomString使用任何您想要的字符串调用。
  3. 您可以使用switch(根据您的要求)选择要使用的符号组。

下面的源码,使用这三点如下:

import java.security.SecureRandom;

public class Main
{
    private static final String CHAR_LOWER = "abcdefghijklmnopqrstuvwxyz";
    private static final String CHAR_UPPER = CHAR_LOWER.toUpperCase();
    private static final String NUMBER = "0123456789";
    private static final String DATA_FOR_RANDOM_STRING = CHAR_LOWER + CHAR_UPPER + NUMBER;
    private static SecureRandom random = new SecureRandom();
    
    public static void main(String[] args) 
    {
        String DNA = "ACTG";
        
        int choice = 5;
        switch(choice)
        {
            case 0: // all alpha numeric
                System.out.println(generateRandomString(10, DATA_FOR_RANDOM_STRING));
                break;
             case 1: // only UpperCase
                System.out.println(generateRandomString(10, CHAR_UPPER));
                break;
             case 2: // only LowerCase
                System.out.println(generateRandomString(10, CHAR_LOWER));
                break;
             case 3: // only numbers
                System.out.println(generateRandomString(10, NUMBER));
                break;
             case 4: // only DNA
                System.out.println(generateRandomString(10, DNA));
                break;
             case 5: // in place string : choose only from "ibra"
                System.out.println(generateRandomString(10, "ibra"));
                break;
          default:
               System.out.println(" choose between 0 and 5");
        }
        
        
    }
    
    public static String generateRandomString(int length, String DataChars) 
    {
        if (length < 1) throw new IllegalArgumentException();

        StringBuilder sb = new StringBuilder(length);
        for (int i = 0; i < length; i++) {
            
            int rndCharAt = random.nextInt(DataChars.length());
            char rndChar = DataChars.charAt(rndCharAt);

            sb.append(rndChar);

        }

        return sb.toString();

}
}

于 2020-09-24T18:08:47.060 回答
0

您的示例中缺少的链接是一种机制,可让该方法知道在生成随机字符串时要使用哪组字符。一种选择是将相关字符作为第二个参数传递给 generateRandomString 函数。下面通过 2 个结构执行此操作:

  1. CharacterGroup - 一组字符(当前作为字符串传入,但如果需要,可以添加其他机制)
  2. StandardGroups - 最常见字符组的枚举(例如:小写字符、数字等)以提高可用性。

一个字符组数组被传递给 generateRandomString 函数,从中可以组装一个随机字符串。

    private static final String NUMBER = "0123456789";
    private static final String CHAR_LOWER = "abcdefghijklmnopqrstuvwxyz";
    private static final String CHAR_UPPER = CHAR_LOWER.toUpperCase();

    public static void main(String[] args)
    {
        for (int i = 0; i < 1; i++)
            System.out.println(generateRandomString(10, StandardGroups.LOWER_CHARS.getChars(), StandardGroups.UPPER_CHARS.getChars()));
    }

    public static String generateRandomString(int length, CharacterGroup... acceptedTypes)
    {
        StringBuilder sb = new StringBuilder(length);
        if (length < 0) throw new IllegalArgumentException("Length must be >= 0");
        for(int i = 0; i < length; i++){ sb.append(chooseRandom(acceptedTypes).randomChar()); }
        return sb.toString();
    }

    public enum StandardGroups
    {
        LOWER_CHARS(new CharacterGroup(CHAR_LOWER)), UPPER_CHARS(new CharacterGroup(CHAR_UPPER)), NUMERICS(new CharacterGroup(NUMBER)), SYMBOLS(new CharacterGroup("!@#."));
        private final CharacterGroup validValues;
        StandardGroups(CharacterGroup validVals){ this.validValues = validVals; }
        public CharacterGroup getChars(){ return validValues; }
    }

    public static final class CharacterGroup
    {
        private final String validValues;
        CharacterGroup(String validValues){ this.validValues = validValues; }
        public char[] getValidVals(){ return validValues.toCharArray(); }
        public char randomChar(){ return validValues.charAt(RANDOM.nextInt(validValues.length())); }
    }

    private static <T> T chooseRandom(T[] data){ if(data.length == 0) throw new IllegalArgumentException("Length must be > 0"); return data[RANDOM.nextInt(data.length)]; }
    private static final SecureRandom RANDOM = new SecureRandom();
于 2020-09-24T18:40:06.930 回答