一、成绩排序案例
需求:用TreeSet集合存储多个学生信息(姓名、语文成绩、数学成绩),并遍历该集合 要求:按照总分从高到低出现
分析: 1、定义学生类 2、创建TreeSet集合的对象,通过比较器排序进行排序 3、创建学生对象 4、把学生对象添加到集合 5、遍历集合
优化:当学生学科比较多时,建议在学生类里面对外提供一个求总分的方法
xxxxxxxxxx
package 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();
}
}
xxxxxxxxxx
package 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、遍历集合
xxxxxxxxxx
package 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);
}
}
}