一、成绩排序案例
需求:用TreeSet集合存储多个学生信息(姓名、语文成绩、数学成绩),并遍历该集合 要求:按照总分从高到低出现
分析: 1、定义学生类 2、创建TreeSet集合的对象,通过比较器排序进行排序 3、创建学生对象 4、把学生对象添加到集合 5、遍历集合
优化:当学生学科比较多时,建议在学生类里面对外提供一个求总分的方法
xxxxxxxxxxpackage ch15;
public class a_11_2Student {
//成员变量 private String name; private int chinese; private int math;
//无参构造方法 public a_11_2Student() { }
//带参构造方法 public a_11_2Student(String name, int chinese, int math) { this.name = name; this.chinese = chinese; this.math = math; }
//成员变量对应的get、set方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public int getChinese() { return chinese; } public void setChinese(int chinese) { this.chinese = chinese; } public int getMath() { return math; } public void setMath(int math) { this.math = math; }
//求总分的方法 public int getSum(){ return this.chinese + this.getMath(); }
}xxxxxxxxxxpackage ch15;
import java.util.Comparator;import java.util.TreeSet;
public class a_11_3测试 {
public static void main(String[] args) {
//创建TreeSet集合的对象,通过比较器排序进行排序 TreeSet<a_11_2Student> ts = new TreeSet<a_11_2Student>(new Comparator<a_11_2Student>() { public int compare(a_11_2Student s1, a_11_2Student s2) { //int num = (s2.getChinese()+s2.getMath()) - (s1.getChinese()+s1.getMath()); //在学生类里面提供求总分方法 int num = s2.getSum() - s1.getSum(); int num2 = num == 0 ? s1.getChinese() - s2.getChinese() : num; //当总分一样时,就再比较语文成绩 //但上面那行还是有问题,当语文成绩也一样就存储不了。解决:再加一条规则,判断名字 int num3 = num2 == 0 ? s1.getName().compareTo(s2.getName()) : num2; return num3; } });
//创建学生对象 a_11_2Student s1 = new a_11_2Student("张三", 97, 100); a_11_2Student s2 = new a_11_2Student("李四", 99, 100); a_11_2Student s3 = new a_11_2Student("王五", 96, 100); a_11_2Student s4 = new a_11_2Student("小红", 98, 100); a_11_2Student s5 = new a_11_2Student("小明", 95, 100); a_11_2Student s6 = new a_11_2Student("小刚", 95, 100); //如何解决总分一样时无法存储的问题。在上面的compare方法中有解决
a_11_2Student s7 = new a_11_2Student("小刚", 95, 100); //当确认是同一个对象时,就不会被存储进来。完美
//把学生对象添加到集合 ts.add(s1); ts.add(s2); ts.add(s3); ts.add(s4); ts.add(s5); ts.add(s6); ts.add(s7);
//遍历集合,要求总分从高到低输出 for (a_11_2Student s : ts) { System.out.println(s.getName() + "," + s.getChinese() + "," + s.getMath() + ",总分为" + s.getSum()); }
}}
一、不重复随机数案例
需求:编写一个程序,获取10个1~20之间的随机数,要求随机数不能重复,并在控制台输出
思路: 1、创建Set集合的对象 2、创建随机数对象 3、判断集合的长度是不是小于10 (1)是:产生一个随机数,添加到集合。这步要循环执行,直到不小于10就退出。即这步完成之后集合里就有10个随机数 4、遍历集合
xxxxxxxxxxpackage ch15;
import java.util.HashSet;import java.util.Random;import java.util.Set;import java.util.TreeSet;
//获取10个1~20之间的随机数,要求随机数不能重复public class a_12_1测试 {
public static void main(String[] args) {
//创建Set集合的对象 Set<Integer> set = new HashSet<Integer>(); //不重复,无序 Set<Integer> set2 = new TreeSet<Integer>(); //不重复,有序
//创建随机数对象 Random r = new Random();
//判断集合是不是小于10,如果是,就循环添加数据到集合里面。其中如果是重复的数据是添加不进去的,直到数据有10个就退出循环 while (set.size() < 10) { //产生一个随机数,添加到集合 int number = r.nextInt(20) + 1; //因为包含0.所以要随机数最大只能达到19。为了能达到20,这里就需要加1 set.add(number); set2.add(number); }
//遍历集合 for (Integer i : set) { System.out.println(i); } System.out.println("-------------------");
//遍历集合 for (Integer i : set2) { System.out.println(i); }
}}