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

时间:2017-12-18 02:10:38

标签: java formatting logic

我正在尝试构建一个打印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以外的其他变量,玩弄数字等但我似乎无法找到抛出格式化的逻辑中的确切缺陷。任何帮助将不胜感激!

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您在随机字符上添加的两个条件,即allLetters[i] <= 90allLetters[i] >= 97,不会涵盖可能字符的整个间隔,在您的程序中,这些字符的间隔为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(',');
    }
}

答案 2 :(得分:0)

我在看你的问题,并且有一个聪明的&#34;使用Java 8+ IntStream和lambdas的解决方案。在int0之间生成75个随机26,将每个值映射到String或{{1}的一个字符'a'偏移量使用'A'中的nextBoolean()。将其收集到一个七十五个字符Random。然后打印我们感兴趣的三个二十五个字符String。赞,

substring