平均散列图中的值

时间:2014-02-03 13:41:26

标签: java hashmap

我正在尝试创建一个平均散列图值的方法。 一直试图解决这个问题。我正在努力做的事情 正在创建一个运行Mann-Whitney U测试的程序。在测试你应该采取 来自两种品牌的评级,将两个品牌的评级合并在一起并对评级进行排名。 如果有相同的评级,你应该得到平均排名。 首先,我需要对整个阵列进行排序,从最低到最高。我使用了索引+1来获得排名。在下面的代码中,数组中有三个7。三人7s位于6,7和8等级。现在我需要从这些数字中获得平均等级(6 + 7 + 8/3)。 下面是我一直在努力的代码。

以下是代码:

int[] ranks = { 2, 3, 3, 5, 6, 7, 7, 7, 8, 9, 10, 10 };

Map<Integer, List<Double>> m = new HashMap<Integer, List<Double>>();



public void fillMap(){

    for (int i = 0; i < ranks.length; i++) {

        //adds ranks to the list.
        List<Double> entries = m.get(ranks[i]);

        if (entries == null) {
            entries = new ArrayList<Double>();
        }

        //Adds index +1 to the list
        entries.add((double) (i + 1)); // 1-indexed position

        //adds everything to the map
        m.put(ranks[i], entries);

    }
    System.out.println("This is the original map: ");
    System.out.println(m);

}

//Method that average the map       
public void getAverages(){

    Map<Integer, Double> newMap = new HashMap<Integer, Double>();

    double average;
    double sum = 0;
    int counter = 0;

    for (Entry<Integer, List<Double>> entry: m.entrySet()) {

        //Fills the list 'value', with the values from the map entry.
        List<Double> value = entry.getValue();
        int key = entry.getKey();           

        for(double ent : value){

            sum += ent;
            counter++;              
        }   

        average = sum / counter; 
        newMap.put(key, average);


    }
    System.out.println("\nThis is the averaged map: ");
    System.out.println(newMap);

}

public static void main(String [] args){

    NewTest nt = new NewTest();

    nt.fillMap();
    nt.getAverages();

}

不确定为什么它不起作用,请帮助。

3 个答案:

答案 0 :(得分:0)

您需要在循环中重新初始化/声明变量,并迭代EntrySet

double average;
/*double sum = 0;
int counter = 0;*/

for (Entry<Integer, List<Double>> entry : m.entrySet()) {
    double sum = 0;//Move them in so that they are 0 for the next loop
    int counter = 0;

此更改可以为您提供结果:

This is the original map: 
{2=[1.0], 3=[2.0, 3.0], 5=[4.0], 6=[5.0], 7=[6.0, 7.0, 8.0], 8=[9.0], 9=[10.0], 10=[11.0, 12.0]}

This is the averaged map: 
{2=1.0, 3=2.5, 5=4.0, 6=5.0, 7=7.0, 8=9.0, 9=10.0, 10=11.5}

答案 1 :(得分:0)

您应该将变量sumcounter声明移动到for循环中。否则,您将累加和和计数器,并且只能正确计算第一个平均值。

double average;

for (Entry<Integer, List<Double>> entry: m.entrySet()) {
    double sum = 0;
    int counter = 0;

答案 2 :(得分:0)

只需在函数getAverages(...)中的for循环中添加此代码:

for (Entry<Integer, List<Double>> entry: m.entrySet()) {
        counter = 0;
        sum = 0;  
     //rest of your code  
    ...  
}

您需要为地图counter中的每个条目初始化summ为零,以获得该条目的正确总和和平均值。