操纵地图内的地图

时间:2014-08-27 21:54:23

标签: java list hashmap

我在文件中有一些购物项目,由" |"分隔。

Adam|grocery|veggies|100.00
John|fuel|gasoline|42.60
John|grocery|veggies|20.00

销售税为8.75%。

  1. 查找每位客户的总收入。
  2. 每位客户都会发现有多少支出用于哪个类别。
  3. 显示每项调查结果的销售税。
  4. 输出:

    Total Revenue:
    Adam - $100.00
    John - $62.60
    Tax - 14.22
    
    Shopping by Adam:
    Grocery - $100.00
    Tax - $8.75
    
    Shopping by John:
    Fuel - 44.60
    Grocery - 20.00
    Tax - $5.47
    

    我使用下面的代码阅读该文件,然后创建一个HashMap,其中String为密钥(以保存客户名称),值为另一个HashMap(用于保存类别(名称)类别作为关键,价格作为价值))

    package test;
    
    import java.io.*;
    import java.util.*;
    
    public class GroceryStore {
    
        public static void main(String[] args) {
            try {
                File inFile = new File("/Users/customers.txt");
                Scanner scan = new Scanner(inFile);
                String lines = "";
    
                Map<String, HashMap<String, Double>> map = new HashMap<String, HashMap<String, Double>>();
    
                while (scan.hasNextLine()) {
                    lines = scan.nextLine();
                    String[] wordSplit = lines.split("\\|");
                    HashMap<String, Double> category = new HashMap<String, Double>();
                    category.put(wordSplit[1], Double.parseDouble(wordSplit[3]));
                    map.put(wordSplit[0], category);
                }
    
                System.out.println("Total revenue by customer: ");
                for (Map.Entry<String, HashMap<String, Double>> entry : map.entrySet()) {
                    System.out.println(entry.getKey() + " - " + entry.getValue());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    

    但它没有像我想的那样工作,无法继续。 在while循环的最后一步中,使用map.put时。这是用新购买替换该人购买的先前条目。但是我希望跟踪该人的所有购买条目。然后我们应该能够显示总输出和分类输出。

    任何人都可以帮忙解决这个问题,你可能有不同的方法吗?

1 个答案:

答案 0 :(得分:0)

此代码未经测试,使用python的csv库将行存储在字典中,并将键作为第一列,在本例中为人名。

import csv

data = {}

with open('/Users/customers.txt', 'rb') as csvfile:
    spamreader = csv.reader(csvfile, delimiter='|', quotechar='"')
    for row in spamreader:
        data[row[0]] = row

    print data