首頁  >  問答  >  主體

java - 如何更好的計算兩個相同格式的Array資料的平均值

現有兩個格式相同JSONArray

一個為新增的資料

saveArray:[{"name":"名字1","value":10},{"name":"名字2","value":12},...,{}]

一個為平均值資料

avgArray:[{"name":"名字1","value":11},{"name":"名字2","value":13},...,{}]

知道計算平均值的數量 int num = 10;

接著根據新增資料,計算平均值後,更新已有的平均值記錄:

最後得到:

newAvgArray:[{"name":"名字1","value":(10 x 11 10)/11},{"name":"名字2","value":(13 x 10 12) /11},...,{}]

我能想到的方法是:

for (int i = 0;i < avgArray.size();i++){
   avgObj = avgArray.get(i).get("value");
   addValue = saveArray.get(i).get("value");
   //然后计算新的值保存新的Array
}

有沒有更好的辦法去計算

巴扎黑巴扎黑2675 天前742

全部回覆(2)我來回復

  • 过去多啦不再A梦

    过去多啦不再A梦2017-06-23 09:15:23

    沒有了。

    演算法上來說,這已經最簡化了。 O(n)

    回覆
    0
  • 为情所困

    为情所困2017-06-23 09:15:23

        public static void getNewArrayAvg(JSONArray add,JSONArray avg,int num){
            JSONArray res = new JSONArray();
            int size = add.size();
            int range = avg.size();
            for (int i = 0; i < size; i++) {
                String key = add.getJSONObject(i).getString("name");
                double avgNum = add.getJSONObject(i).getDoubleValue("value")/(num+1.0);
                for (int j = 0; j < range; j++) {
                    if (key.equals(avg.getJSONObject(j).getString("name"))) {
                        avgNum += avg.getJSONObject(j).getDoubleValue("value") * (num/(num+1.0));
                        JSONObject tmp = new JSONObject();
                        tmp.put("name", key);
                        tmp.put("value", avgNum);
                        res.add(tmp);
                        break;
                    }
                }
            }
            res.toString();
        }

    應該有大神能夠用lambda騷氣的操作,但就你的要求而言,只能取值重新計算,另外,你要多審題。
    不能下面這種操作,要確保name的值能夠對應上。

       avgObj = avgArray.get(i).get("value");
       addValue = saveArray.get(i).get("value");

    回覆
    0
  • 取消回覆