Я вернулся, как советовал, и начал изучать какой-то код, который я ошибался несколько месяцев назад, и пытался его обновить, так как он будет более эффективным.
Все, что я хочу, это для моего метода вернуть новый массив, в котором есть вхождения.
например: 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, никаких массивов, поэтому это немного отличается.
EDIT 1: Я должен был опубликовать свой основной метод, с которым я использую это!
weather.count(res)
где res - массив, который я разместил в верхней части над моим классом
/* ЭТО МОЯ ПЕРВАЯ ПОЧТА КАЖДОГО - если у кого-нибудь есть какие-то советы по формулировке лучшего вопроса, пожалуйста, не стесняйтесь, я хотел бы получить самый ясный, не заданный ответ
Вы могли бы точно реализовать свою текущую реализацию с тем, что предложил @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, и для обработки возвращаемого массива вам потребуется перебрать все миллион и один индекс, причем все они будут пустыми, кроме двух.
когда вы вызываете эту строку:
Integer[] numOccur = new Integer[nums.length]
это означает, что вы создаете новый массив с nums.length, поэтому вы можете получить индекс от 0 до nums.length-1, но когда вы назначаете значение этому массиву, как этот numOccur[count]++;
count - значение массива с именем nums, count может быть больше nums.length-1. Ваша программа может указать исключение ArrayIndexOutOfBoundsException
Вам нужно определить выходной массив на основе максимального значения во входном массиве. Вы можете начать с метода, чтобы найти максимальное значение в массиве, например
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)];
0
до n
. В исходном методе вы предполагали, что n
- это длина массива nums
. Я говорю вам, что n
- это maxValue
массива nums
.