从List中求出最大,最小,平均值的算法!
「已注销」
博客专家认证
2018-05-19 10:59:38
在开发中有这么一个需求:从数据库中一次性查询所有的数据(这个思路是大神给出的,至于为什么我也不好质疑),查询出的数据已经按照id,其他属性排好序了,统统放进一个List<RtocProcessEntity>里面,RtocProcessEntity的定义如下:

public class RtocProcessEntity {

private String wellId;

private Date dailyDate;

private BigDecimal endDepth;

public String getWellId() {
return wellId;
}

public void setWellId(String wellId) {
this.wellId = wellId;
}

public Date getDailyDate() {
return dailyDate;
}

public void setDailyDate(Date dailyDate) {
this.dailyDate = dailyDate;
}

public BigDecimal getEndDepth() {
return endDepth;
}

public void setEndDepth(BigDecimal endDepth) {
this.endDepth = endDepth;
}

@Override
public String toString() {
return "RtocProcessEntity [wellId=" + wellId + ", dailyDate=" + dailyDate + ", endDepth=" + endDepth + "]";
}
}

假设数据如下:

[
RtocProcessEntity [wellId=1, dailyDate=null, endDepth=100],
RtocProcessEntity [wellId=1, dailyDate=null, endDepth=110],
RtocProcessEntity [wellId=1, dailyDate=null, endDepth=150],
RtocProcessEntity [wellId=2, dailyDate=null, endDepth=90],
RtocProcessEntity [wellId=2, dailyDate=null, endDepth=110],
RtocProcessEntity [wellId=3, dailyDate=null, endDepth=90],
RtocProcessEntity [wellId=3, dailyDate=null, endDepth=110],
RtocProcessEntity [wellId=3, dailyDate=null, endDepth=90],
RtocProcessEntity [wellId=3, dailyDate=null, endDepth=110]
]

wellId=1的三条是同一组数据,wellId=2的两条是同一组数据,wellId=3是同一组数据。现在要计算每一组数据的同一小标位置的最大值,最小值,平均,分别放进另外三个List<RtocProcessEntity >里面。
举个例子:
第一步:先将上诉的List拆分为三个list(因为wellId的值有1,2,3,如果wellid是1,2,3,4则拆分为4个List)
list1:

RtocProcessEntity [wellId=1, dailyDate=null, endDepth=100],
RtocProcessEntity [wellId=1, dailyDate=null, endDepth=110],
RtocProcessEntity [wellId=1, dailyDate=null, endDepth=150],

list2:

RtocProcessEntity [wellId=2, dailyDate=null, endDepth=90],
RtocProcessEntity [wellId=2, dailyDate=null, endDepth=110],

list3:

RtocProcessEntity [wellId=3, dailyDate=null, endDepth=90],
RtocProcessEntity [wellId=3, dailyDate=null, endDepth=110],
RtocProcessEntity [wellId=3, dailyDate=null, endDepth=90],
RtocProcessEntity [wellId=3, dailyDate=null, endDepth=110]

输出:
List<RtocProcessEntity> maxList的第一个元素maxList[0]=lis1t[0],因为list1[0],list2[0],list3[0]三者的endDepth属性值中list1[0]的值最大,所以吧list1[0]的值放进maxList[0]里面。maxList[1]=list1[1]或list3[1],因为这两者的值都等于110,所以随便取一个的值放进maxList[1]。maxList[2]=list1[2],list2的长度只有2,没有list2[2],所以抛弃不管,只比较list1和list3,而两者之间,list1[2]的endDepth的值是150,所以将list1[2]放入maxList[2]里面。
按照同样的规则算出最小值,平均值,其实给我求最大值的算法,最小值,平均值我自己算吧,你需要些的代码如下:

public class T {

public static void main(String[] args) {
//测试数据
List<RtocProcessEntity> rotcProcessList = new ArrayList<RtocProcessEntity>();
RtocProcessEntity demo1 = new RtocProcessEntity();
demo1.setWellId("1");
demo1.setEndDepth(new BigDecimal(100));
RtocProcessEntity demo2 = new RtocProcessEntity();
demo2.setWellId("1");
demo2.setEndDepth(new BigDecimal(110));
RtocProcessEntity demo3 = new RtocProcessEntity();
demo3.setWellId("1");
demo3.setEndDepth(new BigDecimal(150));
RtocProcessEntity demo4 = new RtocProcessEntity();
demo4.setWellId("2");
demo4.setEndDepth(new BigDecimal(90));
RtocProcessEntity demo5 = new RtocProcessEntity();
demo5.setWellId("2");
demo5.setEndDepth(new BigDecimal(110));
RtocProcessEntity demo6 = new RtocProcessEntity();
demo6.setWellId("3");
demo6.setEndDepth(new BigDecimal(90));
RtocProcessEntity demo7 = new RtocProcessEntity();
demo7.setWellId("3");
demo7.setEndDepth(new BigDecimal(110));
RtocProcessEntity demo8 = new RtocProcessEntity();
demo8.setWellId("3");
demo8.setEndDepth(new BigDecimal(90));
RtocProcessEntity demo9 = new RtocProcessEntity();
demo9.setWellId("3");
demo9.setEndDepth(new BigDecimal(110));
rotcProcessList.add(demo1);
rotcProcessList.add(demo2);
rotcProcessList.add(demo3);
rotcProcessList.add(demo4);
rotcProcessList.add(demo5);
rotcProcessList.add(demo6);
rotcProcessList.add(demo7);
rotcProcessList.add(demo8);
rotcProcessList.add(demo9);

T demo = new T();
Map<String, List<RtocProcessEntity>> resultMap = demo.calcData(rotcProcessList);
}

public Map<String,List<RtocProcessEntity>> calcData(List<RtocProcessEntity> rotcProcessList) {
Map<String,List<RtocProcessEntity>> resultMap = new HashMap<String,List<RtocProcessEntity>>();
List<RtocProcessEntity> maxList = new ArrayList<RtocProcessEntity>();
List<RtocProcessEntity> minList = new ArrayList<RtocProcessEntity>();
List<RtocProcessEntity> avgList = new ArrayList<RtocProcessEntity>();
//计算的代码
System.out.println(rotcProcessList.toString());
resultMap.put("maxList", maxList);
resultMap.put("minList", minList);
resultMap.put("avgList", avgList);
return resultMap;
}
}

...全文
1021 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2018-05-19
  • 打赏
  • 举报
回复
简单的示意图
我不是李大侠 2018-05-19
  • 打赏
  • 举报
回复
public List<RtocProcessEntity> getMaxlist(List<RtocProcessEntity> rotcProcessList) { //分组 Map<String, List<RtocProcessEntity>> lists= rotcProcessList.stream(). collect(Collectors.groupingBy(RtocProcessEntity::getWellId)); int maxLength =0; //找出最大长度 for( List<RtocProcessEntity> list : lists.values()) { if(list.size()>maxLength) { maxLength =list.size(); } } //返回值 List<RtocProcessEntity> maxList = new ArrayList<RtocProcessEntity>(); for (int j = 0; j < maxLength; j++) { BigDecimal maxEndDepth = BigDecimal.valueOf(0); RtocProcessEntity maxRtocProcessEntity = null; for( List<RtocProcessEntity> list : lists.values()) { if(j<list.size()) if(list.get(j).getEndDepth().compareTo(maxEndDepth)>0) { maxEndDepth = list.get(j).getEndDepth(); maxRtocProcessEntity = list.get(j); } } maxList.add(maxRtocProcessEntity); } return maxList; }
「已注销」 2018-05-19
  • 打赏
  • 举报
回复
代码已经写出来了,是项目组的一年轻小伙子写的,谢谢阿斌,挽救了我今晚明天的加班。

	public Map<String,List<RtocProcessEntity>> calcData(List<RtocProcessEntity> rotcProcessList) {
		Map<String,List<RtocProcessEntity>> tempMap = new HashMap<String,List<RtocProcessEntity>>();
		Map<String,List<RtocProcessEntity>> resultMap = new HashMap<String,List<RtocProcessEntity>>();
			
		for(RtocProcessEntity rpe :rotcProcessList ){
			if(tempMap.get(rpe.getWellId())==null){
				tempMap.put(rpe.getWellId(), new ArrayList<RtocProcessEntity>());
			}
			tempMap.get(rpe.getWellId()).add(rpe);	
		}
		int index = 0;
		
		for(Entry<String, List<RtocProcessEntity>> entry :tempMap.entrySet() ){
			if(entry.getValue().size()>index){
				index = entry.getValue().size();
			}
		}
		
		List<RtocProcessEntity> maxList = new ArrayList<RtocProcessEntity>(index);
		List<RtocProcessEntity> minList = new ArrayList<RtocProcessEntity>(index);
		List<RtocProcessEntity> avgList = new ArrayList<RtocProcessEntity>(index);
		
		for(int i =0;i<index;i++){
			List<RtocProcessEntity> indexList = new ArrayList<RtocProcessEntity>();			
			for(Entry<String, List<RtocProcessEntity>> entry :tempMap.entrySet() ){
				RtocProcessEntity obj = null;
				try{
					obj = entry.getValue().get(i);
				}catch(Exception e){
				}finally {
					if(obj!=null){
						indexList.add(obj);
					}
				}
			}
			maxList.add(max(indexList));
			minList.add(min(indexList));
		}
		
//		System.out.println("最大列表:");
//		System.out.println(Arrays.toString(maxList.toArray()));
//		System.out.println("最小列表:");
//		System.out.println(Arrays.toString(minList.toArray()));
		resultMap.put("maxList", maxList);
		resultMap.put("minList", minList);
		resultMap.put("avgList", avgList);
		return resultMap;
	}	
	
	/**
	 * 平均數
	 * @param data
	 * @return
	 */
	public double average(List<RtocProcessEntity> data){
		BigDecimal sum = new BigDecimal(0);
		for(RtocProcessEntity rpe :data){
			sum.add(rpe.getEndDepth());
		}
		return sum.doubleValue()/data.size();
	}
	public RtocProcessEntity max(List<RtocProcessEntity> data){
		RtocProcessEntity result = new RtocProcessEntity();
		for(RtocProcessEntity rpe :data){
			if(rpe.getEndDepth().compareTo(result.getEndDepth()==null?new BigDecimal(0):result.getEndDepth())>0){
				result = rpe;
			}
		}
		return result;
	}
	public RtocProcessEntity min(List<RtocProcessEntity> data) {
		if(data.size()<=0){
			return null;
		}
		RtocProcessEntity result = data.get(0);
		for(RtocProcessEntity rpe :data){
			if(rpe.getEndDepth().compareTo(result.getEndDepth()==null?new BigDecimal(0):result.getEndDepth())<0){
				result = rpe;
			}
		}
		return result;
	}

测试数据和main方法:

	public static void main(String[] args) {
		T demo = new T();
		List<RtocProcessEntity> rotcProcessList = new ArrayList<RtocProcessEntity>();
		RtocProcessEntity demo1 = new RtocProcessEntity();
		demo1.setWellId("1");
		demo1.setEndDepth(new BigDecimal(100));
		RtocProcessEntity demo2 = new RtocProcessEntity();
		demo2.setWellId("1");
		demo2.setEndDepth(new BigDecimal(110));
		RtocProcessEntity demo3 = new RtocProcessEntity();
		demo3.setWellId("1");
		demo3.setEndDepth(new BigDecimal(150));
		RtocProcessEntity demo4 = new RtocProcessEntity();
		demo4.setWellId("2");
		demo4.setEndDepth(new BigDecimal(90));
		RtocProcessEntity demo5 = new RtocProcessEntity();
		demo5.setWellId("2");
		demo5.setEndDepth(new BigDecimal(110));		
		RtocProcessEntity demo6 = new RtocProcessEntity();
		demo6.setWellId("3");
		demo6.setEndDepth(new BigDecimal(90));
		RtocProcessEntity demo7 = new RtocProcessEntity();
		demo7.setWellId("3");
		demo7.setEndDepth(new BigDecimal(110));		
		RtocProcessEntity demo8 = new RtocProcessEntity();
		demo8.setWellId("3");
		demo8.setEndDepth(new BigDecimal(90));
		RtocProcessEntity demo9 = new RtocProcessEntity();
		demo9.setWellId("3");
		demo9.setEndDepth(new BigDecimal(110));		
		RtocProcessEntity demo10 = new RtocProcessEntity();
		demo10.setWellId("5");
		demo10.setEndDepth(new BigDecimal(60));
		RtocProcessEntity demo11 = new RtocProcessEntity();
		demo11.setWellId("5");
		demo11.setEndDepth(new BigDecimal(80));		
		RtocProcessEntity demo12 = new RtocProcessEntity();
		demo12.setWellId("5");
		demo12.setEndDepth(new BigDecimal(130));
		RtocProcessEntity demo13 = new RtocProcessEntity();
		demo13.setWellId("5");
		demo13.setEndDepth(new BigDecimal(131));	
		RtocProcessEntity demo14 = new RtocProcessEntity();
		demo14.setWellId("5");
		demo14.setEndDepth(new BigDecimal(140));
		rotcProcessList.add(demo1);
		rotcProcessList.add(demo2);
		rotcProcessList.add(demo3);
		rotcProcessList.add(demo4);
		rotcProcessList.add(demo5);
		rotcProcessList.add(demo6);
		rotcProcessList.add(demo7);
		rotcProcessList.add(demo8);
		rotcProcessList.add(demo9);
		rotcProcessList.add(demo10);
		rotcProcessList.add(demo11);
		rotcProcessList.add(demo12);
		rotcProcessList.add(demo13);
		rotcProcessList.add(demo14);
		System.out.println(Arrays.toString(rotcProcessList.toArray()));
		Map<String, List<RtocProcessEntity>> resultMap = demo.calcData(rotcProcessList);
		System.out.println(resultMap.toString());
	}
输出结果:

[RtocProcessEntity [wellId=1, dailyDate=null, endDepth=100], RtocProcessEntity [wellId=1, dailyDate=null, endDepth=110], RtocProcessEntity [wellId=1, dailyDate=null, endDepth=150], RtocProcessEntity [wellId=2, dailyDate=null, endDepth=90], RtocProcessEntity [wellId=2, dailyDate=null, endDepth=110], RtocProcessEntity [wellId=3, dailyDate=null, endDepth=90], RtocProcessEntity [wellId=3, dailyDate=null, endDepth=110], RtocProcessEntity [wellId=3, dailyDate=null, endDepth=90], RtocProcessEntity [wellId=3, dailyDate=null, endDepth=110], RtocProcessEntity [wellId=5, dailyDate=null, endDepth=60], RtocProcessEntity [wellId=5, dailyDate=null, endDepth=80], RtocProcessEntity [wellId=5, dailyDate=null, endDepth=130], RtocProcessEntity [wellId=5, dailyDate=null, endDepth=131], RtocProcessEntity [wellId=5, dailyDate=null, endDepth=140]]
{minList=[RtocProcessEntity [wellId=5, dailyDate=null, endDepth=60], RtocProcessEntity [wellId=5, dailyDate=null, endDepth=80], RtocProcessEntity [wellId=3, dailyDate=null, endDepth=90], RtocProcessEntity [wellId=3, dailyDate=null, endDepth=110], RtocProcessEntity [wellId=5, dailyDate=null, endDepth=140]], avgList=[], maxList=[RtocProcessEntity [wellId=1, dailyDate=null, endDepth=100], RtocProcessEntity [wellId=1, dailyDate=null, endDepth=110], RtocProcessEntity [wellId=1, dailyDate=null, endDepth=150], RtocProcessEntity [wellId=5, dailyDate=null, endDepth=131], RtocProcessEntity [wellId=5, dailyDate=null, endDepth=140]]}

yjsl__ 2018-05-19
  • 打赏
  • 举报
回复
select avg(endDepth) group by wellId; select max(endDepth) group by wellId; select min(endDepth) group by wellId;

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧