我正在尝试创建一个平均散列图值的方法。 一直试图解决这个问题。我正在努力做的事情 正在创建一个运行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();
}
不确定为什么它不起作用,请帮助。
答案 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)
您应该将变量sum
和counter
声明移动到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
中的每个条目初始化sum
和m
为零,以获得该条目的正确总和和平均值。