【发布时间】: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 < count; i++)之类的东西)。 -
@Thomas:好的,谢谢.. 让我试试。
-
ALPHA_NUMERIC_STRING = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; -
random.ints(48,122) .filter(i-> (i<57 || i>65) && (i <90 || i>97))比random.ints('0', 'z') .filter(i-> (i<'9' || i>'A') && (i <'Z' || i>'a'))没有优势此外,您使用了错误的边界。它必须是.ints('0', 'z' + 1),才能包含z,并且您必须使用<=和>=才能包含'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 answer 或 this one 以获得灵感。
标签: java random java-stream