【问题标题】:Alpha Numeric Random Number Sequence [5-digit or 6-digit or any digit] generation字母数字随机数序列[5位或6位或任何数字]生成
【发布时间】:2020-09-01 02:11:53
【问题描述】:

您好,我正在尝试生成一个 5 位随机数,它本质上是字母数字。我在不使用 Streams 的情况下同时使用这两种方法。

代码

public class AlphaRandom {
    
    private static final String ALPHA_NUMERIC_STRING = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
    static final Random random = new Random();
    
    
    public static void main(String args[]) {
        int length = 5;
        String seq = randomAlphaNumeric(length);        
        System.out.println("Random Number Normal  : " +seq);        
        IntStream.range(0,1).forEach(i->System.out.println("Random Number Streams : " +generateRandomString(random, length)));
        
    }
    
    // Using Streams
    private static String generateRandomString(Random random, int length){
        return random.ints(48,122)
                .filter(i-> (i<57 || i>65) && (i <90 || i>97))
                .mapToObj(i -> (char) i)
                .limit(length)
                .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append)
                .toString();
    }
    
    // Normal 
    public static String randomAlphaNumeric(int count) {

        StringBuilder builder = new StringBuilder();    
        while (count-- != 0) {  
            int character = (int)(Math.random()*ALPHA_NUMERIC_STRING.length()); 
            builder.append(ALPHA_NUMERIC_STRING.charAt(character)); 
        }   
        return builder.toString();
    }
}

样本输出

Random Number Normal  : VYAXC
Random Number Streams : LdBN6

Random Number Normal  : 2ANTT
Random Number Streams : hfegc

Random Number Normal  : JWK4Y
Random Number Streams : 8mQXK

但我无法生成仅以UpperCase 开头的序列。 谁能帮帮我。

【问题讨论】:

  • 好吧,您可以使用 2 个字符串并将它们连接起来或组合 2 个流。但是,我建议您考虑为此使用流是否真的在性能、可读性、调试等方面是最佳选择。 - 在您的“正常”方法中,您可以限制选择的字符仅来自大写字符范围(为此,我可能会将while(...) 替换为for(int i = 0; i &lt; count; i++) 之类的东西)。
  • @Thomas:好的,谢谢.. 让我试试。
  • ALPHA_NUMERIC_STRING = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
  • random.ints(48,122) .filter(i-&gt; (i&lt;57 || i&gt;65) &amp;&amp; (i &lt;90 || i&gt;97))random.ints('0', 'z') .filter(i-&gt; (i&lt;'9' || i&gt;'A') &amp;&amp; (i &lt;'Z' || i&gt;'a')) 没有优势此外,您使用了错误的边界。它必须是.ints('0', 'z' + 1),才能包含z,并且您必须使用&lt;=&gt;= 才能包含'9''A''Z''a'。但是为什么不遵循你的非流方法的逻辑并使用random.ints(length, 0, ALPHA_NUMERIC_STRING.length()) .map(ALPHA_NUMERIC_STRING::charAt) .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append) .toString()
  • 另请参阅 this answerthis one 以获得灵感。

标签: java random java-stream


【解决方案1】:

我将使用 apache 库中的 RandomStringUtils 来执行此操作。这样做的原因是代码更少,我相信代码的可读性更好。

这是我的代码,可以做需要的事情

import org.apache.commons.lang3.RandomStringUtils;

public class GenerateRandomString {
    public static void main(String[] args) {
        int keyLength = 5; // Number of character allowed as per requirement
        String randomAlphanumeric = RandomStringUtils.randomAlphanumeric(keyLength);
        System.out.println("randomAlphanumeric generated is " + randomAlphanumeric);
        String upperCaseRandom = randomAlphanumeric.substring(0, 1).toUpperCase() + randomAlphanumeric.substring(1);
        System.out.println("upperCaseRandom generated is " + upperCaseRandom);
    }
}

它将生成以下输出:

randomAlphanumeric generated is m8OiR
upperCaseRandom generated is M8OiR

我正在使用 substring 方法根据问题的要求将第一个字符转为大写。

【讨论】:

    【解决方案2】:

    最简单的方法是在返回你的字符串之前(一旦你生成它),你取第一个字母以应用toUpperCase,然后在剩余的字符上应用toLowerCase。此外,如果将来您需要生成更长的字符串,您可以使用相同的方法而无需更改任何内容。

    夏天我们要做的是:

    public static String manipulate (String rand){
        String c = rand.substring(0,1); // where rand is the random alphanumeric generated by your methods, we pick the first char
        c = c.toUpperCase(); //we make it upperCase
        String split = rand.substring(1); //we get the remaining of the string starting from position 1
        split = split.toLowerCase(); //let's apply lowercase on the remaining
        String result = c+split; //join again
        return result;
    }
    

    完整代码:

    package test;
    
    import java.util.Random;
    import java.util.stream.IntStream;
    
    public class AlphaRandom {
    
        private static final String ALPHA_NUMERIC_STRING = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
        static final Random random = new Random();
    
    
        public static void main(String args[]) {
            int length = 5;
            String seq = randomAlphaNumeric(length);
            System.out.println("Random Number Normal  : " +seq);
            IntStream.range(0,1).forEach(i->System.out.println("Random Number Streams : " +generateRandomString(random, length)));
    
        }
    
        public static String manipulate (String rand){
            String c = rand.substring(0,1); // where rand is the random alphanumeric generated by your methods, we pick the first char
            c = c.toUpperCase(); //we make it upperCase
            String split = rand.substring(1); //we get the remaining of the string starting from position 1
            split = split.toLowerCase(); //let's apply lowercase on the remaining
            String result = c+split; //join the again
            return result;
        }
    
        // Using Streams
        private static String generateRandomString(Random random, int length){
            String rand =  random.ints(48,122)
                    .filter(i-> (i<57 || i>65) && (i <90 || i>97))
                    .mapToObj(i -> (char) i)
                    .limit(length)
                    .collect(StringBuilder::new, StringBuilder::append, StringBuilder::append)
                    .toString();
            return manipulate(rand);
        }
    
        // Normal
        public static String randomAlphaNumeric(int count) {
    
            StringBuilder builder = new StringBuilder();
            while (count-- != 0) {
                int character = (int)(Math.random()*ALPHA_NUMERIC_STRING.length());
                builder.append(ALPHA_NUMERIC_STRING.charAt(character));
            }
            return manipulate(builder.toString());
        }
    }
    

    输出:

    Random Number Normal  : Mwwsz
    Random Number Streams : Q1fqk
    

    【讨论】:

      猜你喜欢
      • 2015-07-29
      • 1970-01-01
      • 1970-01-01
      • 2013-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-21
      相关资源
      最近更新 更多