计算java数组中整数的出现次数

时间:2016-11-28 23:52:44

标签: java arrays

我正在尝试计算数组中整数的出现次数。我希望能够修改以下循环来计算字符...

for (int i = 0; i < chars.length; i++)
     counts[chars[i] - 'a']++;

我尝试像这样修改它但得到一个ArrayIndexOutOfBoundsException错误......

for (int i = 0; i < ints.length; i++)
     counts[ints[i] - '0']++;

有什么想法吗?

我搜索了许多类似标题的问题,但没有按我需要的方式搜索。

已更新

这是我更新的代码。用户输入编号为1到25的整数。程序应该使用另一个数组计算这些整数的出现次数。我使用...

更新了代码
counts[vals[i] - 1]++;

允许程序编译。但是,count的所有值都是零。

更新代码......

import java.util.Scanner;


class CountIntOccurs
{
   private static final int MAX_NUM_OF_VALUES = 200;

   public static void main ( String [] args )
   {
      Scanner in = new Scanner( System.in );
      int[] vals = new int[MAX_NUM_OF_VALUES];
      int numOfVals = 0;

      // Read and store values
      System.out.println( "Enter integers <= 25, one per line, hit control-Z when done: " );
      while ( in.hasNextLine() )
      {
         vals[numOfVals] = Integer.parseInt( in.nextLine() );
         ++numOfVals;
      }

      // Close application if no values entered
      if ( numOfVals == 0 )
         System.exit( 0 );


      //  declare counts array   
      int[] counts = new int[25];


      System.out.println( counts.length );

      //??????? For each integer in the array, count it
      for (int i = 0; i < counts.length; i++){
         counts[vals[i] - 1]++; 
      }



      //display values enetered
      for ( int i = 0; i < numOfVals; ++i )
      {
            System.out.println( vals[i] );
      }


      //?????? display counted integers????
      for ( int i = 0; i < counts.length; ++i )
      {
            System.out.println( counts[i] );
      }


   }
}

现在,我需要的是显示输入的整数的出现次数。如果我输入1 1 2 2 2,结果应为2 3 0 0 0 ... 0。

3 个答案:

答案 0 :(得分:2)

- 'a'的要点是减去'a'(97)的ASCII值,使'a'落入索引0,'z'落入索引25,假设因为chars只包含小写字母字符。

如果ints是包含数字字符char数组,即'0''9'之间的值,那么您的代码就可以使用。更有可能的是,它实际上是一个int数组,通过减去'0'(ASCII 48),你最终会得到一个负数索引。

要解决此问题,只需删除char减法:

counts[ints[i]]++;

答案 1 :(得分:1)

for (int i = 0; i < counts.length; i++) {
    counts[vals[i]-1]++; 
}

这是问题所在,因为您有counts.length而不是numOfVals。对于每个输入的值,循环应该将某个数字的计数增加1,因此您必须保持循环,直到计算每个输入的值。

如果您使用counts.length,如果ArrayIndexOutOfBoundsException小于numOfVals,则会25(因为counts.length已初始化为25) 。如果numOfVals大于25,则只计算前25个输入。

因此解决方案是:

for (int i = 0; i < numOfVals; i++) {
    counts[vals[i]-1]++; 
}

现在,您使用println()代替print()在新行上打印每个数字,并且您不打印任何文本,因此很难解释输出程序。我对程序做了一些肤浅的更改,以便更容易理解。这是完整的程序:

public static void main(String[] args) {
    Scanner in = new Scanner(System.in);
    int[] vals = new int[MAX_NUM_OF_VALUES];
    int numOfVals = 0;

    System.out.println( "Enter integers <= 25, one per line, hit control-Z when done: " );
    while (in.hasNextLine()) {
        vals[numOfVals] = Integer.parseInt(in.nextLine());
        ++numOfVals;
    }
    if(numOfVals == 0)
        System.exit(0);

    int[] counts = new int[25];

    //changed counts.length to numOfVals
    for (int i = 0; i < numOfVals; i++) {
        counts[vals[i]-1]++; 
    }

    //display values entered
    System.out.print("Entered values: ");
    for (int i = 0; i < numOfVals; ++i) {
        System.out.print(vals[i]);
    }
    System.out.println(); //new line

    //display counted integers
    System.out.print("Counts of the values: ");
    for (int i = 0; i < counts.length; ++i) {
        System.out.print(counts[i]);
    }
}

请注意,如果用户输入的值超过200,您也会获得ArrayIndexOutOfBoundsException,因为MAX_NUM_OF_VALUES为200,但您无法实际执行此操作。

答案 2 :(得分:-4)

试图猜测...你需要计算eacth整数的ocorrences? 喜欢这个?

   int[] counts = new int[25];
    for (int i = 0; i < counts.length; i++)
        if (ints[i] >= 1 &&  ints[i] <= 25)
            counts[ints[i]-1]++;

   for (int i = 0; i < counts.length; i++)
     if (counts[i] > 0)
       System.out.println("number " + String.valueOf(i) + " counts " + String.valueOf(counts[i]));