用多重 map 查询水果销售情况

x33g5p2x  于2022-03-16 转载在 其他  
字(1.7k)|赞(0)|评价(0)|浏览(185)

一 问题描述

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()+")");
            }
        }
    }
}

四 测试

绿色为输入,白色为输出。

相关文章