【问题标题】:Java homework: Print Arrays with stored random numbers in itJava 作业:打印其中存储有随机数的数组
【发布时间】:2025-12-21 03:40:06
【问题描述】:

我需要一些帮助来完成课堂作业。我不想得到解决方案,而是想了解我如何解决这个问题,因为即使它很简单,我也真的不明白。

我需要编写一个包含 10 个元素(全部为整数)的数组的程序。将为每个元素设置一个随机生成的数字,每个数字的范围为 0-20。接下来,我必须打印数组元素的位置、随机数和与数组值一样多的星号。

看起来像这样:

Array Value Asterisks
0     5     *****
1     15    ***************

我可以生成数字并将它们存储到数组中,但我无法根据描述打印它们。你能告诉我我做错了什么吗?

public class ForTest{
    public static void main(String[] args) {
        //Method 1
        int[] myNumbers = {0,1,2,3,4,5,6,7,8,9};
        //Method 2
        int[] randomNumbers = new int[10];
        String asterisk = "";

        for( int index=0; index < randomNumbers.length; index++)
        {
            randomNumbers[index] = 1 + (int) ( Math.random() *20);
        } // end for

        for ( int index=0; index < randomNumbers.length; index++)
        {
            switch (randomNumbers[index]) {
                case 1:
                asterisk = "*";
                System.out.println(myNumbers[0] + "\t-->\t" + randomNumbers + asterisk);
                break;
                case 2:
                asterisk = "**";
                System.out.println(myNumbers[1] + "\t-->\t" + randomNumbers + asterisk);
                break;
                case 3:
                asterisk = "***";
                System.out.println(myNumbers[2] + "\t-->\t" + randomNumbers + asterisk);
                break;
                case 4:
                asterisk = "****";
                System.out.println(myNumbers[3] + "\t-->\t" + randomNumbers + asterisk);
                break;
            }
        }
    }
}

【问题讨论】:

  • 让我们从这个开始:System.out.println(myNumbers[0] + "\t--&gt;\t" + randomNumbers + asterisk); .... 这个打印语句中的randomNumbers 是整个数组。你要打印的是数组的一个元素。
  • 您可以在从0randomNumbers[index] 的for 循环中设置要打印的星号数量,而不是使用巨大的switch 语句。这还允许您更改最大随机数,而无需进一步扩展 switch 语句。

标签: java arrays random numbers


【解决方案1】:

1) 让我们从解决作业所需的最少代码开始: 这是一个包含 10 个随机数的数组。我只是复制了你已有的内容

   public static void main(String [] args) {        
        int[] randomNumbers = new int[10];

        for( int index=0; index < randomNumbers.length; index++){
            randomNumbers[index] = 1 + (int) ( Math.random() *20);
        }            
    }

您不需要名为 myNumbers 的第二个数组;您可以改用 randomNumbers 数组的索引

2) 现在让我们再做一步,尝试打印索引。

public static void main(String [] args) {        
    int[] randomNumbers = new int[10];

    for( int index=0; index < randomNumbers.length; index++){
        randomNumbers[index] = 1 + (int) ( Math.random() *20);
    }

    for ( int index=0; index < randomNumbers.length; index++){
        System.out.println(index);                
    }
}

这将输出

0
1
2
...

3)如果你现在将指定索引处的元素添加到打印语句中,你就完成了一半

public static void main(String [] args) {        
    int[] randomNumbers = new int[10];

    for( int index=0; index < randomNumbers.length; index++){
        randomNumbers[index] = 1 + (int) ( Math.random() *20);
    }

    for ( int index=0; index < randomNumbers.length; index++){
        System.out.println(index + "\t" + randomNumbers[index]);                
    }
}

输出

0   4
1   8
2   7
....

4) 我猜你已经知道System.out.println()System.out.print() 之间的区别了。如果不是谷歌是你的朋友。要打印星号,您可以在最后一个循环中添加另一个 for 循环而不是 switch 块

public static void main(String [] args) {        
        int[] randomNumbers = new int[10];

        for( int index=0; index < randomNumbers.length; index++){
            randomNumbers[index] = 1 + (int) ( Math.random() *20);
        }

        for ( int index=0; index < randomNumbers.length; index++){
            System.out.println(index +"\t"+randomNumbers[index]+"\t");
            for ( int x=1; x <= randomNumbers[index]; x++){                
                System.out.print("*");
            }
        }
    }

这将产生

0   4   
****1   11  
***********2    15  
***************3    8
...

5) 不是您需要的,但非常接近。 println() 在打印到新行后跳转,而 print() 保持在同一行。要解决这个问题,请使用 print() 打印一行带有随机数和星号的行,并在内部 for 循环之后跳转到一个带有空 println() 的新行

public static void main(String [] args) {        
        int[] randomNumbers = new int[10];

        for( int index=0; index < randomNumbers.length; index++){
            randomNumbers[index] = 1 + (int) ( Math.random() *20);
        }

        for ( int index=0; index < randomNumbers.length; index++){
            System.out.print(index +"\t"+randomNumbers[index]+"\t");
            for ( int x=1; x <= randomNumbers[index]; x++){                
                System.out.print("*");
            }
            System.out.println();
        }
    }

【讨论】:

  • 最后一个 for 循环的另一个选项是 for (int index = 0; index &lt; randomNumbers.length; index++) { asterisk = ""; for (int i = 0; i &lt; randomNumbers[index]; i++) { asterisk += "*"; } System.out.println(myNumbers[0] + "\t--&gt;\t" + randomNumbers[index] + "\t" + asterisk); }
  • 厄立特里亚语。首先,感谢您提供正确的代码并解释它的每个部分。我试过运行你的代码,它运行良好,直到我添加了最后一个循环。现在我得到这个错误: ForTest.java:12: error: cannot find symbol for (int x=1; x
  • @JoelLi 如果您从字面上复制了最后一个代码 sn-p,它应该运行(它对我有用)
  • @RobinTopper 好吧,我复制了它,它起作用了。我想我一定是打错了。
【解决方案2】:

最后,您想打印 10 个字符串,因此最好先声明一个大小为 10 的 String[]。
你可以通过String[] nameOfArray = new String[10];实现这一点

然后您可以使用一个或多个 for 循环来编辑这些字符串:

for(int i = 0; i < 10; i++) {

/* code to write the index position goes here
 * hint: use the variable i that is declared in the for-loop
 */

/* code to write the value goes here
 * hint: you can append text to a String of your String[] like this:
 * nameOfArray[i] = nameOfArray[i] + "text";
 * or even shorter:
 * nameOfArray[i] += "text";
 */

/* code to write asterisks goes here
 * hint: for(int j = 0; j<amountOfAsterisks; j++)
 */

}

如果你想在最后有一个类似表格的布局,你必须根据值长度添加空格。下面是为小于 10 的值添加空格的示例:

if(number < 10)
    nameOfArray[positionInArray] += " ";

最后你只需要一个循环来遍历数组并打印所有的值。

请注意:我在这里解释的内容很容易理解,但效率不高! (例如,可以:只使用一个循环而不是多个循环,使用 Stringbuilders 而不是 Strings,根本不创建 String[] 而是直接打印,...)

【讨论】:

  • 他似乎已经了解如何使用制表符获得格式正确的输出。因此,您答案的最后一部分是不必要的,实际上比标签更复杂
  • 在打印时传递选项卡大小时,选项卡可能会失败(尽管在本练习中没有限制值大小)但是我还想在不遗漏格式的情况下创建整个练习的概述@RobinTopper
【解决方案3】:

这是一种解决方案:

private static final String PATTERN = "********************";

public static void main(String[] args) {
    System.out.println("Array Value Asterisks");
    IntStream.rangeClosed(1, 10).forEach(i -> {
        int r = (int) (Math.random() * 21);
        System.out.printf("%-6s%-6s%s\n", i, r, PATTERN.substring(0, r));
    });
}

样本输出

Array Value Asterisks
1     10    **********
2     16    ****************
3     3     ***
4     9     *********
5     19    *******************
6     1     *
7     5     *****
8     16    ****************
9     8     ********
10    12    ************

【讨论】:

  • 整洁的解决方案,但正如 OP 所说:我不想得到解决方案,而是想了解我如何解决这个问题......
  • @Robin:是的,你是对的,但我很难发明一个指向解决方案的谜题。我很抱歉。原谅我:)
  • 你不需要发明谜题。你可以给出合理的建议,而不是试图以“花哨的方式”解决琐碎的家庭作业问题来炫耀。考虑到有多少学生实际上在寻求现成的解决方案,有人要求建议而不是解决方案是一个令人耳目一新的变化。如果你想用你的编程技巧给人们留下深刻印象,那就去回答一些更难的问题吧。