Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算java数组中的出现次数_Java - Fatal编程技术网

计算java数组中的出现次数

计算java数组中的出现次数,java,Java,问题是:编写一个程序,读取1-100之间的整数,并统计每个整数的出现次数。假设输入以0结尾。如果数字出现不止一次,则在输出中使用复数“times”。以下是该程序的运行示例: 2出现2次 3发生1次 4发生1次 5出现2次 6发生1次 23发生1次 43发生1次 我已经在代码中修复了读取整数,不再是I,而是一个单独的变量“index”,并理解了为什么我会收到越界异常,但我有点笨,不知道如何在添加sentinel值0的同时修复它 import java.util.Scanner; public c

问题是:编写一个程序,读取1-100之间的整数,并统计每个整数的出现次数。假设输入以0结尾。如果数字出现不止一次,则在输出中使用复数“times”。以下是该程序的运行示例:

2出现2次
3发生1次
4发生1次
5出现2次
6发生1次
23发生1次
43发生1次

我已经在代码中修复了读取整数,不再是I,而是一个单独的变量“index”,并理解了为什么我会收到越界异常,但我有点笨,不知道如何在添加sentinel值0的同时修复它

import java.util.Scanner;

public class countNumberOccurrence{
  public static void main(String args[]){

  int[] numbers = new int[100];
  inputArray(numbers);

  }

  public static void inputArray(int[] myList){
    Scanner input = new Scanner(System.in);
      System.out.print("Enter integers from 1-100 (input 0 value to end inputs): ");
      int index = 0;
      for(int i = 1; i < myList.length - 1; i++){
        if(i > 0){
          index = input.nextInt();  
          myList[index-1]++;  
        }

        if(myList[index-1] > 1)
          System.out.println(index + " occurs " + myList[index-1] + " times ");
        else
          System.out.println(index + " occurs " + myList[index-1] + " time ");
      }             

  }

}
import java.util.Scanner;
公共类countnumberrocurrence{
公共静态void main(字符串参数[]){
整数[]个数=新整数[100];
输入阵列(数字);
}
公共静态void输入阵列(int[]myList){
扫描仪输入=新扫描仪(System.in);
系统输出打印(“输入1-100之间的整数(输入0值到结束输入):”;
int指数=0;
for(int i=1;i0){
index=input.nextInt();
myList[index-1]++;
}
如果(myList[index-1]>1)
System.out.println(索引+“发生”+myList[index-1]+“次数”);
其他的
System.out.println(索引+“发生”+myList[index-1]+“时间”);
}             
}
}

我认为您的问题在于:

if(myList[index-1] > 1)
      System.out.println(index + " occurs " + myList[index-1] + " times ");
如果索引为0,您将尝试访问超出边界的数组的-1元素。请尝试以下方法:

if(index>0){
    if(myList[index-1] > 1)
      System.out.println(index + " occurs " + myList[index-1] + " times ");
    }
    else
      System.out.println(index + " occurs " + myList[index-1] + " time ");
}
这样,如果您的索引为0,则该行不会尝试访问-1元素。

因为您在注释中说,您无法使用正确的惯用方式: 检测
0
输入并结束应用程序的正确逻辑为:

int nextInt;
while ((nextInt = input.nextInt()) != 0)
{
    // do your logic here
}
// print your output here
这是处理输入的正确方法

如果不需要,请不要使用原始阵列! 始终使用适当的类并使用
for/each
或适当的
迭代器进行迭代,这样就不会出现这些一次性错误

你要找的东西叫做多重地图 以下是一个仅适用于JDK的解决方案:

import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.atomic.AtomicInteger;

public class Q21871053
{
    public static void main(final String[] args)
    {
        final Random rnd = new Random();

        final Map<Integer, AtomicInteger> counter = new HashMap<Integer, AtomicInteger>()
        {
            @Override
            public AtomicInteger get(final Object key)
            {
                if (!super.containsKey(key)) { super.put((Integer) key, new AtomicInteger(rnd.nextInt(100))); }
                return super.get(key);
            }
        };

        final AtomicInteger nextInt = new AtomicInteger(rnd.nextInt(100));
        while (nextInt.get() != 0)
        {
            counter.get(nextInt.get()).incrementAndGet();
            if (counter.size() > 1000) { nextInt.set(0); } // limit the run to 1000 numbers
            else { nextInt.set(rnd.nextInt(100)); }
        }

        for (final Integer i : counter.keySet())
        {
        final AtomicInteger integer = counter.get(i);
        final String format = integer.get() > 1 ? "%d occurs %s times\n" : "%d occurs %s time\n";
        System.out.format(format, i, integer);
        }
    }
}
谷歌番石榴有一个很好的
Jarrod给出了一个很好的答案,但如果你有特定的作业规范,一定要列出它们

编辑了这篇文章,很抱歉弄错了。未在if块中指定索引。当用户输入0到结束输入时,会出现越界问题。即使用户已完成,也会尝试插入到数组中。所以放一个if语句来检查0

int index = 0;
  for(int i = 1; i < myList.length - 1; i++){
    if(i > 0){
      index = input.nextInt();  
      if (index > 0 && index < myList.length)
           myList[index-1]++;
      else
        break;  
    }
int索引=0;
for(int i=1;i0){
index=input.nextInt();
如果(索引>0&&index
现在这会起作用,但不是最好的样式。for循环不是最好的选择,因为您不知道用户将输入多少个数字。这将解决您的越界问题,但您的实现中还有一些其他问题。请先解决此问题,然后处理其余代码。

package deneme;
package deneme;

import java.util.Scanner;

public class CountOccuranceNumbers {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Scanner input = new Scanner(System.in);

        int[] number = new int[100];

        System.out.print("Enter the integers between 1 and 100: ");
        for (int i = 0; i < number.length; i++) {
            int a = input.nextInt();
            number[a] += a;
            if (a == 0)
                break;
        }
        for (int i = 1; i < number.length; i++) {
            if (number[i] != 0) {
                if (number[i] / i > 1)
                    System.out.println(i + " occurs " + number[i] / i + " times");
                else
                    System.out.println(i + " occurs " + number[i] / i + " time");               }
        }
    }
}
导入java.util.Scanner; 公共类CountOccuranceNumbers{ 公共静态void main(字符串[]args){ //TODO自动生成的方法存根 扫描仪输入=新扫描仪(System.in); int[]编号=新int[100]; System.out.print(“输入介于1和100之间的整数:”); for(int i=0;i1) System.out.println(i+“发生”+次数[i]/i+“次数”); 其他的 System.out.println(i+“发生”+number[i]/i+“时间”);} } } }
公共类q7{
公共静态void main(字符串[]args){
int arr[]={6,22,20,11,5,18,18,16,30,9,10,10,11,5,18,18,16};
对于(int i=0;i
如果将整个块包装在if(index>0)中,则我的打印代码中的myList[index-1]会出现越界异常正如我在上面的例子中所做的那样,这应该可以防止我不能在我的类赋值中使用类似的东西,基本上我只需要修改我的代码来添加一个0的哨兵值,并将我的读取整数或索引恢复到1-100之间。如果你正在为一家公司做一个项目,或者被要求这样做,那么这就是你的方法这是在一次采访的白板上看到的。感谢所有人的反对票,感谢他们学习了在纯Java和Guava库中实现这一点的惯用方法。我遇到的越界问题来自尝试输入一个0值,该值将索引设置为0,因此产生了问题。我不知道如何创建一个0的工作哨兵值要结束用户的输入,但增加其他的数字。出错了,检查编辑。欢迎使用。请用四个空格缩进代码以使它显示得很好。请参阅更多信息。如果您想改进答案,请考虑在代码中添加散文,以解释为什么您的建议解决了问题以及它是如何解决的。e解释解决方案:(
int index = 0;
  for(int i = 1; i < myList.length - 1; i++){
    if(i > 0){
      index = input.nextInt();  
      if (index > 0 && index < myList.length)
           myList[index-1]++;
      else
        break;  
    }
package deneme;

import java.util.Scanner;

public class CountOccuranceNumbers {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Scanner input = new Scanner(System.in);

        int[] number = new int[100];

        System.out.print("Enter the integers between 1 and 100: ");
        for (int i = 0; i < number.length; i++) {
            int a = input.nextInt();
            number[a] += a;
            if (a == 0)
                break;
        }
        for (int i = 1; i < number.length; i++) {
            if (number[i] != 0) {
                if (number[i] / i > 1)
                    System.out.println(i + " occurs " + number[i] / i + " times");
                else
                    System.out.println(i + " occurs " + number[i] / i + " time");               }
        }
    }
}
public class q7 {

    public static void main(String[] args) {
        int arr[] = {6, 22, 20, 11, 5, 18, 18, 16, 30, 9, 10, 10, 11, 5, 18, 18, 16};
        for (int i = 0; i < arr.length; i++) {
            int count = 0;
            for (int j = 0; j < arr.length; j++) {
                if (arr[i] == arr[j])
                  count++;
            }
            System.out.println(arr[i] + "\toccures\t" + count + " times");
        }
    }
}