Android/Java:计算数组列表中值的平均值的代码



在我的应用程序中,我正在从EEG耳机读取外部值(int)。

我认为该值每秒读取一次,但从我的logcat报告来看,它似乎被读取的次数多于此。

这破坏了我的意图,因为我想计算这些值的平均值。我试图这样做使用增量操作符称为计数。

请注意,从耳机中读取的值只能是1-100,因此平均值的输出必须是不正确的,因为它是168。

我做错了什么?

当前代码:

记录值的位置:

case TGDevice.MSG_MEDITATION:
                //BELOW CODE RELATES TO SAVING AN AVERAGE VALUE
                meditationValues.add(msg.arg1); 
                count++;
                for(int i = 0; i < meditationValues.size(); i++){
                    totalofMedLevels += meditationValues.get(i);
                    Log.d("Total", "Total : " + totalofMedLevels);
                    Log.d("Count ", "Count: " + count);
                }
计算平均:

public void getAverageValue(){
            //stop device so that the values can be recorded
            device.stop();

            averageMedLevel=totalofMedLevels/count; 
            Log.d("Average level:", "Average: " + averageMedLevel);
        }

Logcat输出:

总:

07-14 14:16:44.312: D/Total(30422): Total : 301
07-14 14:16:45.313: D/Total(30422): Total : 301
07-14 14:16:45.313: D/Total(30422): Total : 301
07-14 14:16:45.313: D/Total(30422): Total : 301
07-14 14:16:45.323: D/Total(30422): Total : 301
07-14 14:16:45.323: D/Total(30422): Total : 301
07-14 14:16:45.323: D/Total(30422): Total : 301
07-14 14:16:45.323: D/Total(30422): Total : 342
07-14 14:16:45.323: D/Total(30422): Total : 406
07-14 14:16:45.323: D/Total(30422): Total : 456
07-14 14:16:45.323: D/Total(30422): Total : 496
07-14 14:16:46.314: D/Total(30422): Total : 496
07-14 14:16:46.314: D/Total(30422): Total : 496
07-14 14:16:46.314: D/Total(30422): Total : 496
07-14 14:16:46.314: D/Total(30422): Total : 496
07-14 14:16:46.314: D/Total(30422): Total : 496
07-14 14:16:46.314: D/Total(30422): Total : 496
07-14 14:16:46.324: D/Total(30422): Total : 537
07-14 14:16:46.324: D/Total(30422): Total : 601
07-14 14:16:46.324: D/Total(30422): Total : 651
07-14 14:16:46.324: D/Total(30422): Total : 691
07-14 14:16:46.324: D/Total(30422): Total : 725
07-14 14:16:47.285: D/Total(30422): Total : 725
07-14 14:16:47.285: D/Total(30422): Total : 725
07-14 14:16:47.285: D/Total(30422): Total : 725
07-14 14:16:47.285: D/Total(30422): Total : 725
07-14 14:16:47.285: D/Total(30422): Total : 725
数:

07-14 14:16:47.285: D/Count(30422): Count: 12
07-14 14:16:47.285: D/Count(30422): Count: 12
07-14 14:16:47.285: D/Count(30422): Count: 12
07-14 14:16:47.285: D/Count(30422): Count: 12
07-14 14:16:47.285: D/Count(30422): Count: 12
07-14 14:16:47.295: D/Count(30422): Count: 12
07-14 14:16:47.295: D/Count(30422): Count: 12
07-14 14:16:47.295: D/Count(30422): Count: 12
07-14 14:16:47.295: D/Count(30422): Count: 12
07-14 14:16:47.295: D/Count(30422): Count: 12
07-14 14:16:47.295: D/Count(30422): Count: 12
07-14 14:16:48.286: D/Count(30422): Count: 13
07-14 14:16:48.286: D/Count(30422): Count: 13
07-14 14:16:48.286: D/Count(30422): Count: 13
07-14 14:16:48.296: D/Count(30422): Count: 13
07-14 14:16:48.296: D/Count(30422): Count: 13
07-14 14:16:48.296: D/Count(30422): Count: 13
07-14 14:16:48.296: D/Count(30422): Count: 13
07-14 14:16:48.296: D/Count(30422): Count: 13
07-14 14:16:48.296: D/Count(30422): Count: 13
07-14 14:16:48.296: D/Count(30422): Count: 13
07-14 14:16:48.296: D/Count(30422): Count: 13
07-14 14:16:48.296: D/Count(30422): Count: 13
平均:

07-14 14:16:53.281: D/Average level:(30422): Average: 168

编辑(尝试只保存大于0的值):

if((msg.arg1)!=0){
                    meditationValues.add(msg.arg1); 
                }

                for(int i = 0; i < meditationValues.size(); i++){
                    //totalofMedLevels += meditationValues.get(i); 
                    totalofMedLevels+=msg.arg1;
                    count++; 
                    Log.d("Total", "Total : " + totalofMedLevels);
                    Log.d("Count ", "Count: " + count);
                }

似乎每次你得到一个新值,你遍历整个值列表,并再次将它们全部添加到"totalofMedLevels"。用

替换上面的代码
totalofMedLevels += msg.arg1;
count++;

应该能解决问题。如果没有,说明您没有提供足够的信息(也就是说,没有显示足够的代码)。

我想开关箱是从Listener调用的。所以每次调用这个时,你都在迭代List的大小并将值添加到产生问题的类变量中。将代码修改为:

case TGDevice.MSG_MEDITATION:
         meditationValues.add(msg.arg1); 
         break;

public void getAverageValue(){
        device.stop();
        for(int i = 0; i <= meditationValues.size(); i++){
                totalofMedLevels += meditationValues.get(i);
                Log.d("Total", "Total : " + totalofMedLevels);
                Log.d("Count ", "Count: " + i + 1);
        }
        averageMedLevel = totalofMedLevels/meditationValues.size();
        Log.d("Average level:", "Average: " + averageMedLevel);
  }

为什么不直接使用数组的大小:averageMedLevel=totalofMedLevels/meditationValues.size()

清理你的代码,答案就会变得显而易见。

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
 * @author DShaw
 *
 */
public class Meditation {
    private List<Integer> values;
    public Meditation()
    {
        values = new ArrayList<Integer>();
    }
    public double getSum() {
         double sum = 0; 
         for (Integer i:values)
             sum = sum + i;
         return sum;
    }
    public int getCount()
    {
        return values.size();
    }
    public void addValue(Integer value)
    {
        values.add(value);
    }
    public Double getAverage()
    {
        return getSum()/getCount();
    }
    public static void main(String[] args)
    {
        Meditation m = new Meditation();
        Random r = new Random(System.currentTimeMillis());
        for (int i=0; i < 1000; i++)
        {
            Integer randInt = r.nextInt(100);
            m.addValue(randInt);
            System.out.println("Average for " + 
                               m.getCount() + 
                               " items: " + 
                               m.getAverage());
        }
    }
}

你得到的值比预期的/可能的大,因为你的分母(计数)不是它应该是什么。假设你在数组中有4个值0,0,100,100,平均值显然是50(200/4),但如果由于某种原因,分母是错误的,平均值似乎更大。例如,如果你把项目数错为3,那么平均值似乎是~66或更糟,只有2被计算200/2 = 100。

既然计数是问题,我认为:
如果你想使用一个变量(在你的例子中是count)来跟踪数组的大小,那么你需要在for循环中增加它。
或者,添加设置它等于原始数组的大小

meditationValues.add(msg.arg1); 
count++;
for(int i = 0; i < meditationValues.size(); i++){
  totalofMedLevels += meditationValues.get(i);
  Log.d("Total", "Total : " + totalofMedLevels);
  Log.d("Count ", "Count: " + count);
  case++;
}

或将数组的大小添加到for循环后的count变量中。

for(...){
   .....
   .....
}
case += meditationValues.size();

认为,

相关内容

最新更新