社交网模拟聊天记录
一、题目
程序员王大锤有一个非常喜欢的女神,为了保留和女神的各个瞬间,大锤想把他们的聊天信息(只保留文字)都保 存到自己本地系统,作为以后在一起的甜蜜回忆. 经过自己分析,他和女神聊天的信息库大致如下:
=大锤常用语文件(大锤.txt):= 在么
我给你发了一个红包
好的
=女神常用语文件(女神.txt):=
正要去洗澡…
正在吃饭…
正在和朋友在一起
谢谢,那我不客气了,你早点休息
真的啊,大锤,你真好
大锤你真棒 怎么了,
不开心么
…你怎么回事
…是什么意思
思路分析: 1.聊天记录由于是按行读取,建议使用缓冲字符流 2.女神的聊天记录会根据大锤的的聊天关键字,比如"在么",“红包”,"…",随机在自己三个里面选择回答 3.把大锤的说话当做K值,女神回答系统:Map<String,List>.每个list都是三个答案,根据大锤 的K得到List里面三个数据的一个随机数据 4.你作为大锤模拟输出关键字,检索女神回复信息,然后将聊天的每一行信息最终写入到本地answer.txt
二、代码实现
1.主界面
package ChatHomeWork;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Scanner;
import java.util.Set;
public class Chat {
static Scanner in = new Scanner(System.in);
public static void main(String[] args) throws IOException {
System.out.println("===欢迎来到社交网====");
System.out.println("===系统初始化中====");
System.out.println("请输入聊天的对象");
String name = in.nextLine();
//创建Map集合
Map<String, List<String>> map = showLog();
System.out.println(map);
System.out.println("聊天开始");
System.out.println("聊天记录即将备份到文件,请输入文件名:");
//接收输入的文件名
String fileName = in.nextLine();
String me;
//创建循环
while(true) {
System.out.print("大锤:");
me = in.nextLine();
//调用保存信息的方法
saveLog("大锤",me,fileName);
//调用输入的对象回复信息的方法
String getrePly = getReply(map,me);
//判断getrePly是否为空,不为空将信息存入文件,为空的话输出相应的内容
if(getrePly==null) {
String str = "不想理你,你给我走。。。。。。。";
System.out.println(name+":"+str);
saveLog(name, str, fileName);
}else {
System.out.println(name +":"+getrePly);
saveLog(name, getrePly, fileName);
}
}
}
}
2.创建输入聊天对象信息回复的方法
/**
* 创建输入聊天对象信息回复的方法
* @param map
* @param me
* @return
*/
private static String getReply(Map<String, List<String>> map, String me) {
//定义一个集合,用来接收聊天对象回复的信息
List<String> value = null;
//创建Set集合
Set<String> set = map.keySet();
//使用加强循环进行遍历
for(String obj:set) {
//判断输入的内容和集合中的信息是否包含,并将其存入到value中
if(me.contains(obj.toString())) {
value = map.get(obj);
break;
}
}
//若信息不存在,返回null
if(value == null) {
return null;
}
//创建随机数的对象,获取聊天对象回复的信息
Random radom = new Random();
//从女神文件中随机选择聊天的对话
me = value.get(radom.nextInt(3));
return me;
}
3.初始化聊天字典的方法
private static Map<String, List<String>> showLog() throws IOException {
//初始化聊天的文件字典
Map<String, List<String>> map = new HashMap<String,List<String>>();
//创建文件对象
File chui = new File("src/ChatHomeWork/王大锤.txt");
File girl = new File("src/ChatHomeWork/女神.txt");
//读取对应的聊天对象的文件
List<String> chuiList = readLog(chui);
List<String> girlList = readLog(girl);
//定义一个list集合,用来存放聊天对象的对话
List<String> values;
//创建循环大锤说的话
for(int i=0;i<chuiList.size();i++) {
values = new ArrayList<String>();
//循环输入的女神聊天说的话,和大锤的是1对3
for(int j = i*3;j<i*3+3;j++) {
//将聊天对象说的话添加到集合中
values.add(girlList.get(j));
}
//将语录添加到字典中
map.put(chuiList.get(i),values);
}
return map;
}
4.保存聊天信息的方法
private static void saveLog(String name, String getrePly, String fileName) throws IOException {
//创建文件夹
File file = new File(fileName);
//判断该文件是否存在,若不存在就创建文件
if(!file.exists()) {
file.createNewFile();
}
//格式化时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String date = sdf.format(new Date());
//调用字符缓冲流,加true可以在文件中追加写入信息
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName,true)));
//写入文件
bw.write(date + "-" + name + ":" + getrePly);
//换行
bw.newLine();
//关流
if(bw != null) bw.close();
}
5.读取聊天信息的方法
private static List<String> readLog(File file) throws IOException {
//创建list集合,将读取的信息存入集合中
List<String> list = new ArrayList<String>();
//定义字符缓冲流
BufferedReader br =new BufferedReader(new InputStreamReader(new FileInputStream(file)));
String line;
//为null的话结束循环
while((line =br.readLine()) !=null) {
//将信息添加到集合中
list.add(line);
}
//关流
if(br != null) br.close();
return list;
}
}
注意:为了让你们更好的明白我才分开这样写的,这些代码我都是写在主界面的Chat里面的
6.运行展示