【问题标题】:How to calculate average values of a list?如何计算列表的平均值?
【发布时间】:2015-04-28 08:48:41
【问题描述】:

这是我从服务器解析时的 json:

  {
      "main": [
        {
          "id": "12345"
        }
      ],
      "parameter": [
        {
          "temp": "30.00",
          "acc": "3.00",
          "moisture": "200.00",
          "battery": "98.00",
          "date": "2015-04-13",
          "time": "14:51:05"
        },
        {
          "temp": "32.00",
          "acc": "2.50",
          "moisture": "190.00",
          "battery": "80.00",
          "date": "2015-04-13",
          "time": "14:53:21"
        },
        {
          "temp": "27.00",
          "acc": "5.00",
          "moisture": "200.00",
          "battery": "60.00",
          "date": "2015-04-13",
          "time": "15:06:04"
        },
        {
          "temp": "21.00",
          "acc": "3.00",
          "moisture": "160.00",
          "battery": "60.00",
          "date": "2015-04-13",
          "time": "15:07:13"
        },
        {
          "temp": "30.00",
          "acc": "4.50",
          "moisture": "200.00",
          "battery": "65.00",
          "date": "2015-04-13",
          "time": "10:18:11"
        }
]
}

我用一种方法将时间从格式“hh:mm:ss”转换为“hh”。

public static int convertTime(String time) {


        Date formatTime = null;

        try {
            formatTime = new SimpleDateFormat("hh:mm:ss").parse(time);
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        @SuppressWarnings("deprecation")
        int hour = formatTime.getHours();
        return hour;

    }

然后我想计算每次的平均温度。例如,当我转换为“hh”时,时间 =“14”有 2 个温度值是“30 和 32”。我如何计算平均温度?请帮我。

【问题讨论】:

  • 只需选择与您的时间范围相匹配的值,将这些值相加并除以所选元素的数量。就是这样。
  • 比如你有两个温度值30和32,那么avarageTemp = (30+32)/2;
  • 我认为 OP 想知道如何从 JSON 和他的方法到达那里。
  • 这只是一个例子,如果数据很大,那你怎么办? @sebhaub,巴图汉
  • 最好的方法是使用哈希映射,用 24 个键表示一天 24 小时,然后遍历您的 json 数据,使用您编写的实用程序方法,并在读取时开始平均和存储值ahed 在循环中。

标签: java android json


【解决方案1】:
JSONArray parameter=main.getJSONArray("parameter");
float[] avgTemp=new float[24];

//for 24 hours of the day
for(int i=0;i<24;i++){
     int occurence=0;
     float totalTemp=0;
     for(int j=0;j<parameter.size();j++){
          int time=convertTime(parameter.get(j).getString("time"));
          if(time==i){
               totalTemp+=Float.parseFloat(parameter.get(j).getString("temp"));
               occurence++;
              }
         avgTemp[i]=(totalTemp/occurence);
         }
    }

最后,您将获得数组中所有特定时间的所有平均温度

【讨论】:

  • 检查我的答案亲爱的,请@Vishwajit
【解决方案2】:
Something like this could be useful for you

Map<int, double[]> timeAndTemp = new HashMap<int,double[]>();    
String jSONData = *your json read as string*;
try (InputStream is = url.openStream();
JsonReader rdr = Json.createReader(new StringReader(jSONData)) {

    JsonObject obj = rdr.readObject();
    JsonArray results = obj.getJsonArray("parameters");
    for (JsonObject result : results.getValuesAs(JsonObject.class)) {
         int time = convertTime(result.getString("time"));
         double temp = double.parse(result.getString("temp"));
         if(!timeAndTemp.containsKey(time)){
             timeAndTemp.put(time, temp);
         } else {
             timeAndTemp.get(time).add(temp); 
         }
         timeAndTemp.put(time, temp);
    }
}

//then when you fill in all your data in the map you can easily iterate trough it and get all temperatures for a current time and sum them then divide on their number (the formula for an average number)
//here are some simple examples for using JsonReader and JsonWriter http://www.programmingforliving.com/2013/07/java-api-for-json-processing-jee7-p1.html 

【讨论】:

    【解决方案3】:

    @Vishwaijt Palankar,这是我的代码,请检查,当我运行它时,Logcat 有更多的 totalTemp 和occurrence 值。

     public class Customadapter extends BaseAdapter {
            Context context;
            ArrayList<Parameter> parameterList;
            ArrayList<Parameter> tempArrayList = new ArrayList<Parameter>();
            long dateLong;
            String numhour;
            int count = 0;
            float sum = 0;
            HashMap<String, Float> tempMap;
    
            public Customadapter(Context context, int resource,
                    ArrayList<Parameter> listParameters, long date) {
                super();
                this.context = context;
                this.dateLong = date;
                this.parameterList = getMyList(listParameters);
                Log.d("size", String.valueOf(parameterList.size()));
            }
    
            @SuppressWarnings("static-access")
            private ArrayList<Parameter> getMyList(ArrayList<Parameter> list) {
                for (Parameter parameter : list) {
                    if (((new ConvertData()).convertDate((parameter.getDate()))) == dateLong) {
    
                        tempArrayList.add(parameter);
                    }
                }
    
                return tempArrayList;
            }
    
            @Override
            public int getCount() {
                // TODO Auto-generated method stub
                return parameterList.size();
            }
    
            @Override
            public Object getItem(int position) {
                // TODO Auto-generated method stub
                return parameterList.get(position);
            }
    
            @Override
            public long getItemId(int arg0) {
                // TODO Auto-generated method stub
                return arg0;
            }
    
            @SuppressLint("ViewHolder")
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
    
                LayoutInflater inflater = (LayoutInflater) context
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                View view = inflater.inflate(R.layout.listdatahistory, parent, false);
    
    
                float[] avgTemp = new float[24];
    
                for (int i = 0; i < 24; i++) {
                    int occurenece = 0;
                    float totaltemp = 0;
                    for (int j = 0; j < parameterList.size(); j++) {
                        int time = ConvertData.convertTime(parameterList.get(j)
                                .getTime());
                        if (time == i) {
                            totaltemp += parameterList.get(j).getTemp();
                            occurenece++;
                        }
                        avgTemp[i] = (totaltemp / occurenece);
                        Log.d("temp", String.valueOf(totaltemp));
                        Log.d("occ", String.valueOf(occurenece));
                    }
    
                }
    
                TextView temp = (TextView) view.findViewById(R.id.tempList);
                temp.setText("" + avgTemp);
    
                TextView bat = (TextView) view.findViewById(R.id.batList);
                bat.setText("" + parameterList.get(position).getDate());
    
                return view;
            }
    
        }
    

    【讨论】:

    • 最后做一件事打印数组中计算的所有值并检查它们
    • 而不是打印温度和发生率,而是像这样打印该时间的时间和平均温度 Log.d("time", String.valueOf(time)); Log.d("平均温度", String.valueOf(avgTemp[i]));
    • 请问你这行是什么意思 temp.setText("" + avgTemp); avgTemp 是一个数组
    • @Vishwajit totaltemp += parameterList.get(j).getTemp();是不正确的。它计算列表的所有值
    猜你喜欢
    • 1970-01-01
    • 2011-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-17
    • 1970-01-01
    • 2012-06-03
    • 1970-01-01
    相关资源
    最近更新 更多