Java找出文件中名字出现次数最多学生,并找到该学生的最高成绩

在这里插入图片描述
利用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();
        }
    }
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值