java 解决双重for循环效率问题

解决双重for循环效率问题

题目说明

当拥有2个表时,订单表物品表 时,订单表(客户名称,订单ID)和物品表(订单ID,物品名称)一个客户可以购买多个物品,但是他们的订单ID是唯一的,数据库中数据以JSON字符串的形式传给你。

订单表

订单ID客户名称
A1
B2
C3

物品表

订单ID物品名称
A1
B2
C3

请输出购买最多商品的人?购买最少商品的人?和平均一个人购买多少商品。

题解

1.解决思路,使用映射关系,提取出关键信息进行两表关联。
客户名称 ↔ 订单ID
订单ID ↔ 物品名称
2.使得 订单ID作为唯一性属性进行映射对应。
3.使用Map集合类型代替双重循环提高效率

	/**
	* 提供String orderJSON = “”; 存放订单JSON
	* 提供String commodityJSON = “”; 存放商品JSON
	*/
	Map<String,String> orderMap = new HashMap();
	Map<String,Integer> commodity = new HashMap();

	JSONArray orderJsonArray = JSON.parseArray(orderJSON);
	for(int i = 0;i<orderJsonArray .size();i++){
		String orderStr = orderJsonArray.getString(i);
		JSONObject jsonObject = JSONArray.parseObject(orderStr);
		String customerName = jsonObject.getString("CustomerName");
		String orderID = jsonObject.getString("OrderID");
		orderMap.put(customerName,orderID);
	}

	JSONArray commodityJsonArray = JSON.parseArray(commodityJSON);
	for(int i = 0;i<commodityJsonArray .size();i++){
		String commodityStr = commodityJsonArray.getString(i);
		JSONObject jsonObject = JSONArryay.parseObject(commodityStr);
		String orderID = jsonObject.getString("OrderID");
		String commodityName = jsonObject.getString("CommodityName");
		if(commodity.get(orderID)==null){
			commodity.put(orderID,1);
		}else{
			commodity.put(orderID,commodity.get(orderID)+1);
		}
	}

	String maxStr = "";
	String minStr = "";
	int sum = 0;
	int max = 0;
	int min = commodity.size()/orderMap.size();
	Iterator<Map.Entry<String, Integer>> iterator = commodity.entrySet().iterator();
	while (iterator.hasNext()) {
		Map.Entry<String, Integer> entry = iterator.next();
		//System.out.println(entry.getKey() + "  " + entry.getValue());
		sum += entry.getValue();
		if(entry.getValue()>max()){
			max = entry.getValue();
			maxStr = orderMap.get(entry.getKey());
		}
		if(entry.getValue()<=min()){
			min = entry.getValue();
			minStr = orderMap.get(entry.getKey());
		}
	}
	System.out.println("平均一个用户买物品数为 : "+sum/commodity.size());
	System.out.println("购买最多的客户是 : "+maxStr+" 购买数量为:"+max);
	System.out.println("购买最少的客户是 : "+minStr+" 购买数量为:"+min);
	
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小小狗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值