Java 华为真题-选修课

需求:

     现有两门选修课,每门选修课都有一部分学生选修,每个学生都有选修课的成绩,需要你找出同时选修了两门选修课的学生,先按照班级进行划分,班级编号小的先输出,每个班级按照两门选修课成绩和的降序排序,成绩相同时按照学生的学号升序排序。

输入描述

        第一行为第一门选修课学生的成绩

        第二行为第二门选修课学生的成绩,每行数据中学生之间以英文分号分隔,每个学生的学号和成绩以英文逗号分隔,学生学号的格式为8位数字(2位院系编号+入学年份后2位+院系内部1位专业编号+所在班级3位学号),学生成绩的取值范围为[0,100]之间的整数,两门选修课选修学生数的取值范围为[1-2000]之间的整数。

输出描述

        同时选修了两门选修课的学生的学号,如果没有同时选修两门选修课的学生输出NULL,否则,先按照班级划分,班级编号小的先输出,每个班级先输出班级编号(学号前五位),然后另起一行输出这个班级同时选修两门选修课的学生学号,学号按照要求排序(按照两门选修课成绩和的降序,成绩和相同时按照学号升序),学生之间以英文分号分隔。

输入:

01202021,75;01201033,95;01202008,80;01203006,90;01203088,100

01202008,70;01203088,85;01202111,80;01202021,75;01201100,88

输出:

01202

01202008;01202021

01203

01203088

编码:

ublic class SelectCourse {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        //输入字符串数据
        String[] strs_1 = scanner.nextLine().split(";");
        String[] strs_2 = scanner.nextLine().split(";");
        //集合
        List<Students> list1 = parseData(strs_1);
        List<Students> list2 = parseData(strs_2);
        //集合
        Set<String> sets = new HashSet<>();
        //调用方法
        List<Students> list =sameCourse(list1,list2,sets);
        //sets排序,转换成List
        List<String> my =new ArrayList<>(sets);
        Collections.sort(my);

        //调用排序方法
        getComparator(list,my);

    }

    /**
     * 1.获取学生信息
     *
     * @param strs
     * @return
     */
    private static List<Students> parseData(String[] strs) {
        List<Students> list = new ArrayList<>();
        //循环
        for (int i = 0; i < strs.length; i++) {
            //分割字符串
            String[] ss = strs[i].split(",");
            //将对象添加集合中
            list.add(new Students(ss[0], Integer.parseInt(ss[1])));
        }
        return list;
    }

    /**
     * (2) 统计同时选修两门选修课的学生信息
     * @param list1  第一门选修课学生的成绩
     * @param list2  第二门选修课学生的成绩
     * @param sets  学号前五位
     * @return
     */
    public static List<Students> sameCourse(List<Students> list1, List<Students> list2, Set<String> sets) {
        List<Students> list = new ArrayList<>();
        //循环比较
        for (Students stu1 :
                list1) {
            for (Students stu2 :
                    list2) {
                //判断学号是否相同
                if (stu1.getNo().equals(stu2.getNo())) {
                    //累计成绩和
                    int sum = stu1.getScore() + stu2.getScore();
                    //添加到集合中
                    list.add(new Students(stu1.getNo(), sum));

                    //截取学号前五位-存入set集合中,过滤重复的
                    String strNo = stu1.getNo().substring(0, 5);
                    sets.add(strNo);
                }
            }
        }
        //判断如果没有,则返回NULL
        if (list.size() == 0) {
            System.out.println("NULL");
        }
        return list;
    }

    /**
     * (3) 学号按照要求排序(按照两门选修课成绩和的降序,成绩和相同时按照学号升序
     * @param list
     * @param sets
     */
    public static void getComparator(List<Students> list,List<String> sets){
        //外部排序
        Collections.sort(list,new Comparator<Students>(){
            @Override
            public int compare(Students o1, Students o2) {
                //升序
                return Integer.valueOf(o1.getNo())-Integer.valueOf(o2.getNo());
            }
        });

        //输出信息
        for (String str:
             sets) {
            System.out.println(str);
            //对象
            StringBuilder builder=new StringBuilder();
           //循环
            for (Students lls:
                 list) {
                //是否相等
                if(str.equals(lls.getNo().substring(0,5))){
                   builder.append(lls.getNo()).append(";"); //添加
                }
            }
            System.out.println(builder.toString());
        }
    }



}

//学生类
class Students {
    private String no;
    private int score;
    
    .....setXXX and getXXX......

    public Students(String no, int score) {
        this.no = no;
        this.score = score;
    }

    @Override
    public String toString() {
        return no + "=>" + score;
    }
}

效果:

 

猜你喜欢

转载自blog.csdn.net/hlx20080808/article/details/132871405
今日推荐