Java集合框架篇-64-TreeSet集合练习题2

       这篇继续来学习一个关于TreeSet集合编程题的分析过程和代码实现过程。这个题目还是比较复杂的,涉及到OOP,键盘输入和集合排序等。编程的题目是:输入5个学生信息,格式为(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低排序输出。

1.分析

       看题目,我们第一个看到的是学生信息,那么是不是需要写一个学生类,然后看到需要键盘输入,但是输入格式是一组,所以这里还需要字符串切割,根据逗号切割。切割出来数字符串数组,所以需要把成绩的字符串类型转换成Int类型。看到总分排序,所以我们需要Set集合,这里我们使用TreeSet集合。总分比较,说明TreeSet集合传入参数是一个比较器,比较的是总分成绩。大致,我们可以按照以下步骤去划分这个题目成不同的小任务去实现。

1)定义一个Student类

   成员变量:姓名,语文成绩,数学成绩,英语成绩,总分成绩

   成员方法:空参,有参构造,有参构造的参数分别是姓名,语文成绩,数学成绩,英语成绩

                   toString方法,需要重写,遍历学生类打印不是内存地址,而是属性的值。

2)创建键盘录入对象,需要导入Scanner类

3)创建TreeSet集合对象,传入参数是比较器,总分比较

4)录入5个学生信息,集合的size就是等于5,超过不继续存储

5)录入字符串切割,逗号切割,返回是一个字符串数组,需要把成绩字符串转成Int类型

6)转换后结果封装到学生类对象里,然把学生类对象添加到TreeSet集合中

7)遍历TreeSet集合,打印学生信息


2.代码实现过程

      根据上分析步骤,我们尝试去完成一部分代码,先完成那些简单,自己能够完成的。然后对照下面的代码,参考写出自己的代码。

学生类Student.java 代码如下。

package bean;

public class Student {
	
	private String name;
	private int yuWenScore;
	private int mathScore;
	private int englishScore;
	private int totalScore;
	
	public Student() {
		super();
	}

	public Student(String name, int yuWenScore, int mathScore, int englishScore) {
		super();
		this.name = name;
		this.yuWenScore = yuWenScore;
		this.mathScore = mathScore;
		this.englishScore = englishScore;
		this.totalScore = this.yuWenScore + this.mathScore + this.englishScore;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getYuWenScore() {
		return yuWenScore;
	}

	public void setYuWenScore(int yuWenScore) {
		this.yuWenScore = yuWenScore;
	}

	public int getMathScore() {
		return mathScore;
	}

	public void setMathScore(int mathScore) {
		this.mathScore = mathScore;
	}

	public int getEnglishScore() {
		return englishScore;
	}

	public void setEnglishScore(int englishScore) {
		this.englishScore = englishScore;
	}


	public String toString() {
		return name + ","+ yuWenScore + ","+mathScore + ","+englishScore + ","+ totalScore;
	}

	public int getTotalScore() {
		return totalScore;
	}

}

测试类,代码

package treeset;

import java.util.Comparator;
import java.util.Scanner;
import java.util.TreeSet;

import bean.Student;

public class Test1_TreeSet {

	public static void main(String[] args) {
		
		//2.创建Sacnner对象
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入学生成绩,格式是:姓名,语文成绩,数学成绩,英语成绩");
		//3.创建treeset集合
		TreeSet<Student> ts = new TreeSet<>(new Comparator<Student>() {

			@Override
			public int compare(Student s1, Student s2) {
				//降序
				int num = s2.getTotalScore() - s1.getTotalScore();
				return num == 0? 1 : num;  //总分成绩相同的也需要存入集合
			}
			
		});
		
		//4.录入5个学生成绩信息,开始循环
		while(ts.size() < 5) {
			
			//5. 切割字符串
			String line = sc.nextLine();
			//切割并存入数组
			String[] arr = line.split(",");
			//转换成Int
			int chinese = Integer.parseInt(arr[1]);
			int math = Integer.parseInt(arr[2]);
			int english = Integer.parseInt(arr[3]);
			
			//6.转换后结果封装到学生类对象里,然把学生类对象添加到TreeSet集合中
			ts.add(new Student(arr[0],chinese, math, english));
			
		}
		//7.遍历TreeSet集合,打印学生信息
		System.out.println("排序后的学生信息");
		
		for (Student student : ts) {
			System.out.println(student);
		}
		
		
	}

}

控制台测试结果:

请输入学生成绩,格式是:姓名,语文成绩,数学成绩,英语成绩
zhangsan,50,60,89
lisi,77,88,99
wanger,55,99,100
liuliu,88,100,100
zhouqi,88,99,94
排序后的学生信息
liuliu,88,100,100,288
zhouqi,88,99,94,281
lisi,77,88,99,264
wanger,55,99,100,254
zhangsan,50,60,89,199
       这里需要注意下逗号,如果代码中切割采用是英文输入法的逗号,输入成绩的时候逗号也需要写英文,否则切割之后不是你想要的数组,可能报索引越界异常错误。
  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值