解决双重for循环效率问题
题目说明
当拥有2个表时,订单表
和物品表
时,订单表(客户名称,订单ID)和物品表(订单ID,物品名称)一个客户可以购买多个物品,但是他们的订单ID是唯一的,数据库中数据以JSON字符串的形式传给你。
订单表
订单ID | 客户名称 |
---|---|
A | 1 |
B | 2 |
C | 3 |
… | … |
物品表
订单ID | 物品名称 |
---|---|
A | 1 |
B | 2 |
C | 3 |
… | … |
请输出购买最多商品的人?购买最少商品的人?和平均一个人购买多少商品。
题解
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);