我试图找到一个int数组的模式。我想出了一个我认为应该有效的算法,但事实并非如此。我收到以下错误:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at Statistik.typvärde(Statistik.java:157)
at Statistik.main(Statistik.java:17)
这是我的代码:
public static int typvärde(int list[]) {
int oc[] = new int[list.length];
int counter = 0;
int typvärde = 0;
int max = 0;
int typindex = 0;
for(int i = 0; i < list.length; i++) {
for(int j = 0; j < list.length; j++) {
if(list[i] == list[j]) {
counter++;
}
oc[i] = counter;
}
}
max = Maxmin.max(oc);//class function that finds max of an array
typindex = Arrays.asList(oc).indexOf(max);
typvärde = list[typindex];
return typvärde;
}
答案 0 :(得分:5)
Arrays.asList(oc)
将创建一个包含单个数组元素的List<int[]>
,而不是List<Integer>
。
因此,indexOf
将始终返回-1,因为您使用整数调用它(当您调用indexOf(oc)
时,您将获得0的唯一情况是,因为数组不会覆盖等于和哈希码)
编写自己的indexOf
方法,搜索基本数组或使用引用数组(Integer[]
)。
修复后,您仍需要在访问list[typindex]
之前检查返回值。
<小时/> 这是代码中的subtile bug。现在正如评论中所说,你有一个逻辑错误。您需要在外循环的每次迭代时重置计数器,否则
counter
将继续增加,Maxmin.max(oc)
将始终返回数组的最后一个元素。
那就是说,您可能想要使用其他方法。以下是一些想法:
例如,如果您拥有数组{1,7,2,3,3,7,2,7}
,则先对其进行排序,以便获得{1,2,2,3,3,7,7,7}
。然后你看了1
。完成阅读2
后,您会检查您阅读它们的次数是否超过1
。如果是,则更新变量,并继续阅读下一个数据,直到结束。
Map<Integer, Integer>
来映射数字及其在数组中出现的次数。然后返回具有最高关联值的条目键。