使用Array [i] Logic进行格式化

问题描述 投票:2回答:3

我正在尝试构建一个程序,打印75个随机大写和小写字母,每行25个。我认为我已经完成了所有逻辑,但每当我运行它时,格式化全部关闭,而不是每行打印25个字符,它会打印一个随机数。到目前为止,这是我的代码:

char allLetters[] = new char[3700];

for(int i = 1; i <= 75; i++) { //Begin for loop

int max = 122;
int min = 65;

allLetters[i] = (char)(Math.random() * (max - min) + min);

if(i % 25 != 0){

if (allLetters[i] <= 90) {
    System.out.printf("%s,",allLetters[i]);
}

if (allLetters[i] >= 97) {
    System.out.printf("%s,",allLetters[i]);
}

} //Close if

else {

if (allLetters[i] <= 90) {
    System.out.printf("%s\n",allLetters[i]);
}

if (allLetters[i] >= 97) {
    System.out.printf("%s\n",allLetters[i]);
}

}

} //End for

目前,输出类似于:

U,i,y,e,v,T,G,p,P,a,U,G,e,B,w,U,o,F,G,w,j,m,R
O,X,w,w,u,p,t,g,X,J,R,c,w,I,d,H,R,m,y,b,o
C,p,M,F,X,U,v,O,a,Y,F,E,x,s,x,k,C,b,D,R,r,H

我尝试使用除了i之外的不同变量,玩弄数字等但我似乎无法找到抛出格式化的逻辑中的确切缺陷。任何帮助将不胜感激!

java formatting logic
3个回答
2
投票

您的逻辑问题在于,即使您不打印它,也会计算每个选定的字符。落在90和97之间的ASCII字符(不包括在内)不是字符,您可以正确地跳过它们。然而,循环仍在计算那些迭代,就像打印了一个有效的字母一样。这导致输出中的计数不正确。

下面的代码片段中使用的解决方法是继续在循环中拾取字符,直到我们实际获得小写或大写字母。只有这样,我们才能继续你以前的逻辑。

char allLetters[] = new char[3700];
int max = 122;
int min = 65;

for (int i = 1; i <= 75; i++) {
    char next;
    do {
        next = (char)(Math.random() * (max - min) + min);
    } while (next > 90 && next < 97);
    allLetters[i] = next;
    if (i % 25 != 0) {
        System.out.printf("%s,", next);
    }
    else {
        System.out.printf("%s\n", next);
    }
}

Demo


0
投票

您对随机字符的两个条件,即allLetters[i] <= 90allLetters[i] >= 97,不包括可能字符的整个间隔,在您的程序中为65到122(包括65和122)。当生成91到96之间的字符时,您的程序不会打印任何内容。获得这六个随机字符之一的概率大约为10%,因此您可以打印21..23个字符。

如果你真的想跳过这六个字符,请使用while循环而不是for循环修复问题,并仅在打印时增加打印字符的计数器:

int printed = 0;
while (printed != 75) {
    char ch = (char)(Math.random() * (max - min) + min);
    if (ch >= 91 && ch <= 96) continue;
    printed++;
    System.out.print(ch);
    if (printed % 25 == 0 {
        System.out.println();
    } else {
        System.out.print(',');
    }
}

0
投票

我在看你的问题,而且有一个使用Java 8+ IntStream和lambdas的“聪明”解决方案。在int0之间生成75个随机26,使用来自String'a'将每个值映射到'A'nextBoolean()偏移的单字符Random。收集到一个七十五个字符String。然后打印我们感兴趣的三个二十五个字符substring。就像,

Random rand = new Random();
String s = IntStream.generate(() -> rand.nextInt(26)).limit(75)
        .mapToObj(i -> Character.toString(
                rand.nextBoolean() ? (char) (i + 'a') : (char) (i + 'A')))
        .collect(Collectors.joining());
System.out.println(s.substring(0, 25));
System.out.println(s.substring(25, 50));
System.out.println(s.substring(50));
© www.soinside.com 2019 - 2024. All rights reserved.