我已按照建议回去了,几个月前开始查看我错误的一些代码,并且一直在尝试更新它,以便更有效率。
我想要的只是让我的方法返回一个包含其中出现位置的新数组。
例如: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是我在班级上方发布的数组
/ *这是我的第一篇文章 - 如果有人有任何关于措辞更好的问题的提示请不要犹豫,我想最清楚,没有给出答案
答案 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的数组,并且为了处理返回的数组,你需要遍历所有一百万个和一个索引,所有这些索引都是空的,除了两个。