我遇到阵列问题

时间:2014-11-30 02:39:26

标签: java arrays

我遇到了这个数组代码的问题。它需要有一个数字计数,显示用户输入的数字。因此,例如,如果用户输入三个四,则会说“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]);
     }
  }   
}

3 个答案:

答案 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

More info for third point is here