2014-07-02 51 views
0

我必须编写方法来查找给定数字数组的平均值,中位数,模式等。我已经完成了所有其他的工作,但是模式给了我很多时间,不知道为什么。查找数组方法(java)

该阵列是22,26,45,46,49,55,57,63,63,65,66,67,67,68,68,69,70,71,72,73,75,76 ,76,77,77,78,78,78,79,82,82,83,84,85,87,88,88,89,89,91,92,98,99

它正在返回22当答案应该是78

这里是我的代码:

public static int mode(int[] array){ 
    int[] countArray = new int[101]; 

    //counts each number 
    for(int i = 0; i < array.length; i++){ 
     countArray[array[i]]++; 
    }// end for loop 

    int mode = array[0], modeIndex = 0; 

    //finds which number occurs the most 
    System.out.println(Arrays.toString(countArray)); 
    for(int i = 1; i < array.length; i++){ 
     if(countArray[i] > mode){ 

     mode = countArray[i]; 
     modeIndex = i; 
     System.out.println(mode + " " + modeIndex); 
     }// end if 
    }// end for loop 

    return modeIndex; 
}// end method mode 
+2

有不少东西错了,试着调试你的代码,逐步完成它,问题应该变得明显。 – Taylor

+2

[这个答案](http://stackoverflow.com/a/15725452/2817802)是你正在寻找的 – Baby

回答

1

你有一个错误,你需要改变两行:

if(countArray[i] > mode){ 
    mode = countArray[i]; 

到:

if(countArray[array[i]] > mode){ 
    mode = array[i]; 
+0

谢谢,我实际上已经在发布之前花了一个小时,然后几乎立即找出它。对不起,没有回来,让每个人都知道。不过谢谢。 – PsylentKnight

1

你的错误是:INT模式=数组[0],应该是int模式= countArray [0] 而在循环,你应该使用countArray的大小,而不是阵列。 该代码正常工作(结果是78)

public static int mode(int[] array){ 
    int[] countArray = new int[101]; 

    //counts each number 
    for(int i = 0; i < array.length; i++){ 
     countArray[array[i]]++; 
    }// end for loop 

    int mode = countArray[0], modeIndex = 0; 

    //finds which number occurs the most 
    System.out.println(Arrays.toString(countArray)); 
    for(int i = 1; i < countArray.length; i++){ 
     if(countArray[i] > mode){ 

     mode = countArray[i]; 
     modeIndex = i; 
     System.out.println(mode + " " + modeIndex); 
     }// end if 
    }// end for loop 

    return modeIndex; 
}// end method mode` 
1

另一种方法是使用HashMap的

代码:

 int arraya[] = {22, 26, 45, 46, 49, 55, 57, 63, 63, 65, 66, 67, 67, 68, 68, 69, 70, 71, 72, 73, 75, 76, 76, 77, 77, 78, 78, 78, 79, 82, 82, 83, 84, 85, 87, 88, 88, 89, 89, 91, 92, 98, 99}; 
    List<Integer> array = new ArrayList<>(); 
    for (int i = 0; i < arraya.length; i++) { 
     array.add(arraya[i]); 
    } 

    HashMap<Integer, Integer> count = new HashMap<>(); 

    for (Integer i : array) { 
     if (count.containsKey(i)) { 
      int c = count.get(i); 
      count.put(i, c + 1); 
     } else { 
      count.put(i, 1); 
     } 
    } 

    List listOfOccurance = new ArrayList(); 
    Set<Map.Entry<Integer, Integer>> entrySet = count.entrySet(); 
    for (Map.Entry<Integer, Integer> entry : entrySet) { 
     System.out.println(entry.getKey() + " = " + entry.getValue()); 
     listOfOccurance.add(entry.getValue()); 

    } 
    Integer i = (Integer) Collections.max(listOfOccurance); 

    while (it.hasNext()) { 
     Map.Entry pairs = (Map.Entry) it.next(); 
     if ((Integer) pairs.getValue() == i) { 
      System.out.println(pairs.getKey()); 
      return; 
     } 
     it.remove(); // avoids a ConcurrentModificationException 
    } 

输出:

65 = 1 66 = 1 67 = 2 68 = 2 69 = 1 70 = 1 71 = 1 72 = 1 73 = 1 75 = 1 76 = 2 77 = 2 78 = 3 79 = 1 82 = 2 83 = 1 84 = 1 85 = 1 22 = 1 87 = 1 88 = 2 89 = 2 26 = 1 91 = 1 92 = 1 98 = 1 99 = 1 45 = 1 46 = 1 49 = 1 55 = 1 57 = 1 63 = 2 
The mode is 78