java - 如何更好的計(jì)算兩個(gè)相同格式的Array數(shù)據(jù)的平均值
問(wèn)題描述
現(xiàn)有兩個(gè)格式相同JSONArray
一個(gè)為新增的數(shù)據(jù)
saveArray:[{'name':'名字1','value':10},{'name':'名字2','value':12},...,{}]
一個(gè)為平均值數(shù)據(jù)
avgArray:[{'name':'名字1','value':11},{'name':'名字2','value':13},...,{}]
知道計(jì)算平均值的數(shù)量 int num = 10;
然后根據(jù)新增數(shù)據(jù),計(jì)算平均值后,更新已有的平均值記錄:
最后得到:
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'); //然后計(jì)算新的值保存新的Array}
有沒(méi)有更好的辦法去計(jì)算
問(wèn)題解答
回答1:沒(méi)有了。
算法上來(lái)說(shuō),這個(gè)已經(jīng)最簡(jiǎn)化了。O(n)
回答2: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(); }
應(yīng)該有大神能夠用lambda騷氣的操作,但就你的要求而言,只能取值重新計(jì)算,另外,你要多審題。不能下面這種操作,要確保name的值能夠?qū)?yīng)上。
avgObj = avgArray.get(i).get('value'); addValue = saveArray.get(i).get('value');
相關(guān)文章:
1. 關(guān)docker hub上有些鏡像的tag被標(biāo)記““This image has vulnerabilities””2. boot2docker無(wú)法啟動(dòng)3. docker-compose中volumes的問(wèn)題4. docker安裝后出現(xiàn)Cannot connect to the Docker daemon.5. nignx - docker內(nèi)nginx 80端口被占用6. javascript - mock.js可以存儲(chǔ)數(shù)據(jù)嗎7. docker網(wǎng)絡(luò)端口映射,沒(méi)有方便點(diǎn)的操作方法么?8. java - SSH框架中寫(xiě)分頁(yè)時(shí)service層中不能注入分頁(yè)類9. docker images顯示的鏡像過(guò)多,狗眼被亮瞎了,怎么辦?10. java - Spring事務(wù)回滾問(wèn)題

網(wǎng)公網(wǎng)安備