菜单文件处理
假设某个餐馆平时使用: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);
}
}