【问题标题】:Counting occurences of integers in a java array计算java数组中整数的出现次数
【发布时间】:2016-11-28 23:52:44
【问题描述】:

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

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 。

【问题讨论】:

  • 你能出示ints[i]的声明吗?它真的包含字符'0''9',还是整数09?我的猜测是后者,而且不一样。
  • ints 包含从 1 到 25 的随机整数值
  • 是的,整数。而且代码是减去'0',不是整数,是字符。
  • 为什么counts被初始化为numOfVals?如果用户输入 1 个值并且大于 1 怎么办?
  • 如果您的范围是 1 到 25,不应该是 counts = new int[25]; 吗? (如果是 0 到 25,则执行 new int[26]。)

标签: java arrays


【解决方案1】:

- 'a'的意义在于减去'a'的ASCII值(97),使得'a'落入索引0,'z'落入索引25,假设chars只包含小写字母字符。

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

要解决问题,只需删除字符减法:

counts[ints[i]]++;

【讨论】:

  • 阅读他们的评论,我认为他们可能需要counts[ints[i] - 1]++;
  • @Tunaki 这样会更节省空间,但不太直观。不过,无论哪种方式都可以。
  • Tunaki...我使用了您的建议,程序编译,但所有计数值都是 0 ... 零
  • @codeRed 在这种情况下提供minimal reproducible example。我们帮助您的能力有限。
【解决方案2】:
for (int i = 0; i < counts.length; i++) {
    counts[vals[i]-1]++; 
}

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

如果你使用counts.length,如果numOfVals小于25,你将得到ArrayIndexOutOfBoundsException(因为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,但您无法实际执行该值。

【讨论】:

    【解决方案3】:

    尝试猜测...您需要计算每个整数的出现次数? 像这样?

       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]));
    

    【讨论】:

    • 有大于 8 的整数(或 9,正如您对 new int[9] 的预期)。我认为你完全误解了这个问题。
    • 代码正在计算字符...你期望什么。
    • 没有。它不计算字符。正如您自己所说:“只有整数......嗯,好吧。”问题是他得到了ArrayIndexOutOfBoundsException,因为他从索引值中减去了 97(因为他将整数视为字符),但 ints[i] 的值范围是 0 到 24(或类似的值),而不是 97 到 123,所以他在 counts[] 中得到一个负索引值。
    • 好的,我改了答案。
    猜你喜欢
    • 1970-01-01
    • 2017-03-24
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    • 2017-02-13
    • 2015-06-18
    • 1970-01-01
    相关资源
    最近更新 更多