利用IO流知识写入数据,在控制台输出文本文件中名字出现最多的人,以及这个人最高的成绩是多少,以及这个人出现的次数
我的方法用得有些复杂,望大佬勿喷,希望大佬们指点一些更为优化的方法
public class Test {
//这个集合用于存放文本里面的每一行数据
public static ArrayList<String> list = new ArrayList<>();
//这个集合用于存放出现的人名以及人名出现的次数(利用HashMap)key值不重复的原理
public static HashMap<String,Integer> map= new HashMap<>();
public static void main(String[] args) {
File file = new File("/Users/jzy/Desktop/jzy/test.txt");
writeFile(file);
readFile(file);
//创建string二维数组用来接收list中被切割的姓名和成绩
String[][] str = new String[list.size()][2];
for(int i = 0;i < list.size();i++){
str[i][0] = list.get(i).split(",")[0];
str[i][1] = list.get(i).split(",")[1];
}
//把数组中的姓名和成绩存入map集合中,key值为姓名,value为出现的次数
for(int i = 0;i < str.length;i++){
String name = str[i][0];
if(map.containsKey(name)){
map.put(name,map.get(name)+1);
}else{
map.put(name,1);
}
}
//定义一个变量用来接收map中value的最大值,也就是最多的次数
int max = 0;
Set<Map.Entry<String, Integer>> set = map.entrySet();
Iterator<Map.Entry<String, Integer>> it = set.iterator();
while (it.hasNext()){
Map.Entry entry = it.next();
if((int)entry.getValue() > max){
max = (int)entry.getValue();
}
}
//把map集合中的所有元素新建一个entry对象再次遍历,找到最多次数对应的人,定义一个变量用来接收人名
String name = "";
Set<Map.Entry<String, Integer>> set3 = map.entrySet();
Iterator<Map.Entry<String, Integer>> it2 = set3.iterator();
while (it2.hasNext()){
Map.Entry entry3 = it2.next();
if((int)entry3.getValue() == max){
name = entry3.getKey() + "";
}
}
//从list集合里面找到包含这个人名的数据,把这个人的数据单独用集合list2存放
ArrayList<String> list2 = new ArrayList<>();
for(String i : list){
if(i.contains(name)){
list2.add(i);
}
}
//把list2的每条数据进行切割,只保留每条数据的成绩,再把成绩单独用集合list3存放
ArrayList<Integer> list3 = new ArrayList<>();
for(int i = 0;i < list2.size();i++){
list3.add(Integer.parseInt(list2.get(i).split(",")[1]));
}
//对只含有出现次数最多那个人的只有成绩的集合进行降序排序,最大值为下标为list3.size()-1
Collections.sort(list3);
System.out.println("出现次数最多的人:" + name + " , 最高成绩:" + list3.get(list3.size()-1) + " , 出现次数:" + max);
}
//利用字节缓冲输出流将内容写入文件中
private static void writeFile(File file) {
BufferedOutputStream bos = null;
try {
bos = new BufferedOutputStream(new FileOutputStream(file));
bos.write("张三,33\n李四,78\n王五,90\n王五,88\n王五,99\n张三,100\n李四,97\n李四,101\n李四,88".getBytes());
bos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/*
//利用字节缓冲输入流读取文件
private static void readFile(File file) {
BufferedInputStream bis = null;
InputStreamReader fis = null;
BufferedReader br = null;
try {
bis = new BufferedInputStream(new FileInputStream(file));
fis = new InputStreamReader(bis);
br = new BufferedReader(fis);
String mes = "";
while ((mes = br.readLine()) != null){
System.out.println(mes);
}
bis.close();
fis.close();
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
*/
//利用字符输入流读取文件内容,并把每一行数据存入ArrayList集合中
public static void readFile(File file){
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader(file));
String mes = "";
while ((mes = br.readLine()) != null){
list.add(mes);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}