一问题描述
Joe经营一家水果店,他想要一份水果销售情况明细表,这样就可以很容易掌握所有水果的销售情况了。
输入:
第一行表示有M次成功交易。其后有M行数据,每行都表示一次交易,由水果名称、水果产地和交易水果数量组成。
输出:水果先按照产地分类,产地按照字母顺序排列;同一产地的水果按照名称排序。
输入样例
5
apple shandong 3
pineapple guangdong 1
sugarcane guangdong 1
pineapple guangdong 3
pineapple guangdong 1
输出样例
guangdong
|-----pineapple(5)
|-----sugarcane(1)
shangdong
|-----apple(3)
二算法设计
本问题统计水果销售情况(产品、名称、销售数量)。水果按产地分类,产地按字母顺序排序;同一产地的水果按照名称排序,名称按照字母顺序排序。可以利用map的有序性和映射关系解决。
1定义一个双重Map<String,TreeMap<String, Integer>>,其中外层 map 键是产品,值是一个map,内存map键是水果名称,值是数量。
2根据输入信息,统计销售数量,mp[place][name]+=num。
3按顺序输出统计信息。
三实现
package map;import java.util.TreeMap;import java.util.Map;import java.util.Scanner;import java.util.Set;public class FruitMap {public static void main(String[] args) {Map<String, TreeMap<String, Integer>> mp = new TreeMap<>();Scanner scanner = new Scanner(System.in);int m = scanner.nextInt();for (int i = 0; i < m; i++) {String name = scanner.next();String place = scanner.next();int num = scanner.nextInt();TreeMap<String, Integer> innerMap = mp.get(place);// 没这个地名if (innerMap == null) {innerMap = new TreeMap<>();innerMap.put(name, num);mp.put(place, innerMap);} else { // 有这个地名Integer oldNum = innerMap.get(name);if (oldNum == null) { // 没这个水果innerMap.put(name, num);} else { // 有这个水果innerMap.put(name, num + innerMap.get(name));}}}Set<Map.Entry<String, TreeMap<String, Integer>>> entries = mp.entrySet();for (Map.Entry<String, TreeMap<String, Integer>> entry : entries) {System.out.println(entry.getKey());TreeMap<String, Integer> entryValue = entry.getValue();Set<Map.Entry<String, Integer>> innerMap = entryValue.entrySet();for (Map.Entry<String, Integer> item : innerMap) {System.out.println(" |----"+item.getKey()+"("+item.getValue()+")");}}}}
四测试
绿色为输入,白色为输出。