我遇到了这个数组代码的问题。它需要有一个数字计数,显示用户输入的数字。因此,例如,如果用户输入三个四,则会说“4”。我已经完成了大部分代码,但它只返回输入的第一个数字。
import java.util.Scanner;
public class NumberCounts
{
public static void main(String args[])
{
int[] answer = new int [100];
inputArray(answer);
}
public static void inputArray(int[] Numbercounts)
{
System.out.println("This Program is written by Benjamin Barcomb\n");
Scanner kb = new Scanner(System.in);
System.out.print("How many numbers will you enter? : ");
kb.nextInt();
//int[] answer = new int[100];
int arryNum[] = new int[] {};
System.out.println("\nEnter numbers in [0, 100] range separated by a space:");
int input = kb.nextInt();
System.out.println("Number Count");
int[] counter = new int[] {input};
for (int i = 0; i < arryNum.length; i++) {
System.out.println(" " + (i + 1) + " " + counter[i]);
}
for (int i = 0; i < counter.length; i++) {
System.out.println(" " + (i + 1) + " " + counter[i]);
}
}
}
答案 0 :(得分:2)
从哪里开始...
1)你创建一个长度为100的数组answer
,将它传递给你的方法,然后再也不用在任何地方。
2)您要求用户告诉您他们要输入多少个号码,您使用kb.nextInt()
获得该输入,然后对其执行任何操作。您永远不会将该int分配给变量。
3)您创建一个数组arryNum
并将其留空。你从来没有把任何东西放进去。
4)您要求用户输入以空格分隔的数字。然后,您只需输入他们输入的第一个。
由于您似乎只是在学习,我会将编码留给您。希望如果您现在可以看到代码的某些部分正在做什么,那么您将能够继续前进。我的一个提示是使用更具描述性的变量名称。它使您更容易阅读查看代码时发生的事情。
部分解决方案
1)除非要求说你必须将数组传递给inputArray()
方法,否则我会将它们全部删除,因为你正在进行该方法中的所有其他工作。我会删除int[] answer = new int [100];
调用没有参数inputArray()
的方法,并将方法的签名更改为
public static void inputArray() { ... }
2)当你问用户他们要输入多少个号时,你基本上会问他们“我的阵列需要多长时间?”当你得到这个int时,你应该使用它来制作你的新数组。像
这样的东西System.out.print("How many numbers will you enter? ");
int usersNumbers = new int[kb.nextInt()];
注意我已将arrayNum
的名称更改为usersNumbers
。它更具描述性,使您可以更轻松地阅读代码。
3)现在你想获得所有这些数字并将它们放入该数组中。由于您需要获得多个数字,因此需要循环。再说一遍,除非要求你必须这样做,否则我会做的有点不同。我不是单独输入由空格分隔的一行上的所有数字,而是单独询问数字。由于我们知道数组的长度(它们要输入的数量),我们知道提示它们的次数。
System.out.println("\nEnter numbers in [0, 100] range.\n");
for (int i = 0; i < usersNums.length; i++) {
System.out.println("Enter Your Number:");
usersNums[i] = kb.nextInt();
}
4)现在计算输入的每个int的出现次数。由于用户可以以任意随机顺序输入他们的数字,因此更加困难。同样,我不确定你的要求是否允许,但这就是我所做的。首先,我想得到一个唯一数字列表。例如,如果数组是{2,4,2,5,2,4},我想获得{2,4,5}的列表。有了这些,我可以查看每个数字并通过数组计算我看到每个数字的次数。获取唯一数字列表的简便方法是将它们放入Set
。它是一种不允许重复的数据结构。 TreeSet
是一个Set,它将数字按顺序排列,以便于阅读。
Set<Integer> uniqueNumbers = new TreeSet<Integer>();
for (int i : usersNums) { uniqueNumbers.add(i); }
现在我有了可以开始计算的唯一数字列表。我从0开始计数。然后对于集合中的每个数字,我查看数组中的每个数字,看看它们是否相同。如果是,则计数增加1.一旦我到达数组的末尾,我打印该数字的结果,然后将计数重置为0.
int count = 0;
for (Integer i : uniqueNumbers) { //For every number in the Set
for (int j = 0; j < usersNums.length; j++) { //Look at every number in the array
if (i == usersNums[j]) { count++; } //If the same, count++
}
System.out.print(i + " - " + count + "\n"); //Print results
count = 0; //Reset Count
}
答案 1 :(得分:1)
您似乎只获得了第一个值,因为您只在扫描仪上调用了nextInt()
一次。理想情况下,您应该有一个while循环来继续收集用户输入。此外,我认为你试图将你的答案存储在一个数组中,这实际上并不理想,因为你不知道你的输入有多大。你应该真的使用一个列表。
List<Integer> data = new ArrayList<Integer>();
while (kb.hasNext()) {
data.add(kb.next());
}
答案 2 :(得分:1)
解释您的代码希望您了解如何解决它。
首先,我假设您希望您的用户输入多个号码,但您使用的是nextInt,这意味着
java.util.Scanner.nextInt()
方法扫描 下一个标记 输入为一个int 。调用此方法的形式 nextInt()的行为方式与调用完全相同 nextInt(radix),其中radix是此扫描器的默认基数。
建议:尝试使用while循环来读取更多数字,当您的用户输入-999999
例如作为while循环的终止时。
第二次,使用Array
使用的数据结构不正确,因为您不知道数组的大小。
有两种方法可以解决此问题:
<强> 1 即可。首先从用户那里询问数组的大小,例如用户想要输入多少个数字,这不是你想要的。
<强> 2 即可。使用另一个收缩和扩展的数据结构,ArrayList
第三次,你没有说你的输入中是否会有不同的数字
1 1 2 3 3 4 4 5 or unsorted like `1 2 1 4 3 4 5`
或只是您的输入包含相同的数字,如
2 2 2 2 2 2 2