Java:查找int数组的模式

时间:2015-10-25 23:11:19

标签: java

我试图找到一个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;  
}

1 个答案:

答案 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>来映射数字及其在数组中出现的次数。然后返回具有最高关联值的条目键。