菜单文件处理(利用Map实现存储)

菜单文件处理

假设某个餐馆平时使用:1)文本文件(orders.txt)记录顾客的点菜信息,每桌顾客的点菜记录占一行。每行顾客点菜信息的记录格式是“菜名:数量,菜名:数量,…菜名:数量”。例如:“烤鸭:1,土豆丝:2,烤鱼:1”。2)文本文件(dishes.txt)记录每种菜的具体价格,每种菜及其价格占一行,记录格式为“菜名:价格“。例如:“烤鸭:169”。编写一个程序,能够计算出orders.txt中所有顾客消费的总价格。(注意,请使用文本读写流,及缓冲流来处理文件)

知识储备

Map
图源网络
1.Map中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值。
2.需要注意的是,Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。
3.Map中常用的集合为HashMap集合、LinkedHashMap集合。

HashMap<K,V>:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

LinkedHashMap<K,V>:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。

注意:Map接口中的集合都有两个泛型变量<K,V>,在使用时,要为两个泛型变量赋予数据类型。两个泛型变量<K,V>的数据类型可以相同,也可以不同。

Map接口中的常用方法
图源网络
1.get方法:获取指定键(key)所对应的值(value)。
2.put方法:将指定的键与值对应起来,并添加到集合中。
注意:使用put方法时,若指定的键(key)在集合中存在,则返回值为集合中键对应的值(该值为替换前的值),并把指定键所对应的值,替换成指定的新值。
3.remove方法:根据指定的键(key)删除元素,返回被删除元素的值(value)。
4.map.containsKey(Object key)方法,判断key是否存在

代码如下:

/*
绝对路径是写上是为了与相对路径做对比,
实际操作中没有调用。
且绝对路径为本人电脑上的项目路径,
如需使用,请更换为自己的路径。
*/
import java.io.*;
import java.util.*;
public class Main {
 public static void main(String[] args) {
  BufferedReader input1=null;
  BufferedReader input2=null;
  String path1="D:\\eclipse-jee-neon-3-win32\\test\\src\\orders.txt";//绝对路径
  String filename1="src\\orders.txt";//相对路径(相对于项目工程为根目录)
        //使用Map记录菜名及数量
  Map<String,Integer>orders=new HashMap<String,Integer>();
  try{//尝试读入菜名以及数量
   input1=new BufferedReader(new InputStreamReader(new FileInputStream(filename1)));
   //创建 FileInputStream通过使用文件描述符 fdObj
   //其表示在文件系统中的现有连接到一个实际的文件。
   String s=input1.readLine();//读入一行文字
   while(s!=null) {
    String[] s1=s.split(",");
    for(int i=0;i<s1.length;i++){
     String[] s2=s1[i].split(":");
     if(s2.length==2){//书写符合规范时,将菜名和数量存储在map中
      if(!orders.containsKey(s2[0])) {
       //如果之前没点过这个菜(key不存在)
       //数量(value)直接存入
      orders.put(s2[0],Integer.parseInt(s2[1]));
      }
      else {//如果点过这个菜(key存在),则累计数量(value值)
       int t=orders.get(s2[0])+Integer.parseInt(s2[1]);
       orders.put(s2[0],t);
      }
     }
    }
    s=input1.readLine();//读取下一行数据
   }
   input1.close();
  }catch(Exception e) {
   System.out.println("路径错误");
  } 
  
  String path2="D:\\eclipse-jee-neon-3-win32\\test\\src\\dishes.txt";
  String filename2="src\\dishes.txt";
  int sum=0;
  try{
  input2=new BufferedReader(new InputStreamReader(new FileInputStream(filename2)));
  String ss=input2.readLine();
  while(ss!=null) {
   String[] ss1=ss.split(":");
   if(ss1.length==2){
    sum+=orders.get(ss1[0])*Integer.parseInt(ss1[1]);
   }
   ss=input2.readLine();
  }
  input2.close();
 }catch(Exception e) {
  System.out.println("路径错误");
 }
  System.out.println("总价格:"+sum);
 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值