计算数组内的出现次数

时间:2015-04-13 00:41:31

标签: java arrays

我已按照建议回去了,几个月前开始查看我错误的一些代码,并且一直在尝试更新它,以便更有效率。

我想要的只是让我的方法返回一个包含其中出现位置的新数组。

例如:count({2,4,0,7,4,2,1,0}) returns {2,1,2,0,2,0,0,1}

到目前为止,我的方法是这个,只是为了记录,我想观众,我正在使用的数组就是这个。

18  29  23  35  23  28  36  27  16  21  33  21  18  33  16  6  19  22  9  26  28  16  19  14  18  12  17  28

这是我的计数类

public int[] count(Integer[] nums)
{
    Integer[] numOccur = new Integer[nums.length]; //new array that will be returned with the occurances

    for (int i = 0; i < nums.length; ++i) //goes through the array for nums.length times.
    {
        Integer count = nums[i]; //assigns count to nums[i]
        numOccur[count]++;         //ERROR
        System.out.println(numOccur[i]); //testing to see if i'm printing the right value
    }

    return numOccur;
}

我得到了

at WeatherSrv.count(WeatherSrv.java:94)
    at WeatherDrv.main(WeatherDrv.java:55)
Java Result: 1

我知道问题发生在我的数组[] numOccur的新元素的赋值中,是不是因为我的作业?我只是想知道我是否朝着正确的方向前进。

在我之前的版本中,我只使用了switch语句,没有数组,所以这有点不同。

编辑1:我应该发布我的主要方法,我正在使用它!

weather.count(res)其中res是我在班级上方发布的数组

/ *这是我的第一篇文章 - 如果有人有任何关于措辞更好的问题的提示请不要犹豫,我想最清楚,没有给出答案

3 个答案:

答案 0 :(得分:0)

您需要根据输入数组中的最大值来调整输出数组的大小。您可以从一个方法开始,以查找数组中的最大值,如

private static int getMaxValue(Integer[] nums) {
    int max = nums[0];
    for (int i = 1; i < nums.length; i++) {
        max = Math.max(max, nums[i]);
    }
    return max;
}

然后你的方法应该像'

那样调整它的输出数组
// You return an `int[]`
int[] numOccur = new int[1+getMaxValue(nums)];

答案 1 :(得分:0)

当你拨打这一行时:

Integer[] numOccur = new Integer[nums.length]

这意味着您使用nums.length创建一个新数组,因此您可以获得一个介于0和nums.length-1之间的索引,但是当您为此数组赋值时,这样numOccur[count]++; count是一个值名为nums的数组,count可能大于nums.length-1。您的计划可能会指出ArrayIndexOutOfBoundsException

的例外情况

答案 2 :(得分:0)

你可以肯定地使用@Elliott Frisch建议的当前实现,但你也可以采用不同的路线并使用HashMap

这是一个使用HashMap的工作解决方案,它具有额外的好处,即不需要迭代可能大量的空索引,因为只有初始数组中存在的数字才会有一个值。 HashMap

import java.util.HashMap;

public class CountOccur
{
  public static void main(String[] args)
  {
    Integer[] arr = new Integer[]{2,4,0,7,4,2,1,0};
    HashMap<Integer, Integer> countMap = count(arr);

    for (Integer key : countMap.keySet()) {
      System.out.println(key + " count: " + countMap.get(key));
   }

  }

  public static HashMap<Integer, Integer> count(Integer[] nums)
  { 
      HashMap<Integer, Integer> countMap = new HashMap<Integer, Integer>();

      for (int i = 0; i < nums.length; ++i)
      {
          Integer count = countMap.get(nums[i]); 
          if (count  == null){
            //first occurrence, enter a value of 1 for count
            countMap.put(nums[i], 1);
          }
          else{
            //already in the HashMap, increment the count
            countMap.put(nums[i], count + 1);
          }

      }

      return countMap;
  }
}

输出:

0 count: 2
1 count: 1
2 count: 2
4 count: 2
7 count: 1

要解决原始方法的缺点,请设想输入:{1,1000000}。你需要一个大小为1000001的数组,并且为了处理返回的数组,你需要遍历所有一百万个和一个索引,所有这些索引都是空的,除了两个。