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}
有没有更好的办法去计算
问题解答
回答1:没有了。
算法上来说,这个已经最简化了。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(); }
应该有大神能够用lambda骚气的操作,但就你的要求而言,只能取值重新计算,另外,你要多审题。不能下面这种操作,要确保name的值能够对应上。
avgObj = avgArray.get(i).get('value'); addValue = saveArray.get(i).get('value');
相关文章:
1. apache - 本地搭建wordpress权限问题2. docker 下面创建的IMAGE 他们的 ID 一样?这个是怎么回事????3. css3 - transition属性当鼠标一开的时候设置的时间不起作用4. 热切期待朱老师的回复,网页视频在线播放器插件配置错误5. macos - mac下docker如何设置代理6. Android下,rxJava+retrofit 并发上传文件和串行上传文件的效率为什么差不多?7. angular.js - ng-grid 和tabset一起用时,grid width默认特别小8. javascript - web网页版app返回上一页按钮在ios设备失效怎么办?安卓上可以,代码如下,请大神帮助,万分感谢。9. Whitelabel错误页面发生意外错误(类型=未找到,状态= 404)/WEB-INF/views/home.jsp10. java - Spring Mvc全局异常处理器@ControllerAdvice不起作用?
