自然排序 Comparable 的使用
存储学生对象并遍历,创建TreeSet集合使用 无参构造方法
要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
比较器排序Comparator的使用
存储学生对象并遍历,创建TreeSet集合使用带参构造方法
要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
自然排序 Comparable 的使用
1.定义一个学生类
package Comparable;
/*
3.8自然排序Comparable的使用
存储学生对象并遍历,创建TreeSet集合使用 无参构造方法
要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
*/
public class student implements Comparable<student>{
//成员方法
private String name;
private int age;
//构造方法
public student() {
}
public student(String name, int age) {
this.name = name;
this.age = age;
}
//get/set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//直接输入compareTo 自动生成
@Override
public int compareTo(student s) {
//* return 0;//认为是重复元素不添
//return 1;//1的话会认为不重复(按照 升序 存储顺序)
// return -1; //不重复(按照 降序 存储顺序)*//*
// 主要条件:按照年龄从小到大
int num = this.age - s.age;//升序 this就是s2 s就是s1
// int num = s.age - this.age; //降序
//次要条件:年龄相同时,按照姓名的字母顺序排序
//这里可以姓名相同年龄不同
//int num = this.name - s.name;
//int num2 = num == 0 ? this.age.compareTo(s.age) : num;
int num2 = num == 0 ? this.name.compareTo(s.name) : num;
//当num==0时this.name跟s.name进行比较(采用字母顺序进行排序)
//如果num不等于0 返回num(: num)
return num2;
}
}
2.定义一个TreeSet测试类
package Comparable;
import java.util.Iterator;
import java.util.TreeSet;
/*
自然排序 Comparable 的使用
存储学生对象并遍历,创建TreeSet集合使用 无参构造方法
要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
结论
用TreeSet集合存储自定义对象,无参构造方法使用的是 自然排序 对元素进行排序的
自然排序,就是让元素所属的类 实现Comparable接口,重写 compareTo(To)方法
重写方法时,一定要注意排序规则必须按照要求的 主要条件 和 次要条件 来写
*/
public class Comparabledemo {
public static void main(String[] args) {
//创建集合对象
TreeSet<student> tree = new TreeSet<student>();//无参构造方法
//创建学生对象
student s1 = new student("wuer",27);
student s2 = new student("weuers",250);
student s3 = new student("wcdds",215);
student s4 = new student("sdew",295);
student s5 = new student("swdds",295);
student s6 = new student("wcdds",215);//保证唯一性
//添加元素
tree.add(s1);
tree.add(s2);
tree.add(s3);
tree.add(s4);
tree.add(s5);//return为0 认为是重复的
tree.add(s6);
//采用迭代器进行遍历
Iterator<student> it = tree.iterator();
while(it.hasNext()){
student s = it.next();
System.out.println(s.getName()+",\t"+s.getAge());
//ClassCastException 类转换异常
//在student类中 实现Comparable
//重写Comparable方法
}
System.out.println("---------");
//采用for循环进行遍历
for (student s : tree) {
System.out.println(s.getName()+",\t"+s.getAge());
}
}
}
排序Comparator的使用
1创建一个学生类
package Comparator;
/*
比较器排序Comparator的使用
存储学生对象并遍历,创建TreeSet集合使用带参构造方法
要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
结论
用TreeSet集合存储自定义对象,带参构造方法使用的是比较器排序对元素进行排序的
比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(T o1,T o2)方法
重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写
*/
public class student {//去掉 implements Comparable<student>
//成员方法
private String name;
private int age;
//构造方法
public student() {
}
public student(String name, int age) {
this.name = name;
this.age = age;
}
//get/set方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
/*@Override
public int compareTo(student s) {
*//* return 0;//认为是重复元素不添
return 1;//1的话会认为不重复(按照 升序 存储顺序)
return -1; //不重复(按照 降序 存储顺序)*//*
// 主要条件:按照年龄从小到大
int num = this.age - s.age;//升序 this就是s2 s就是s1
// int num = s.age - this.age; //降序
//次要条件:年龄相同时,按照姓名的字母顺序排序
int num2 = num == 0 ? this.name.compareTo(s.name) : num;
//当num==0时this.name跟s.name进行比较(采用字母顺序进行排序)
//如果num不等于0 返回num(: num)
return num2;
}*/
}
2.定义一个TreeSet测试类
package Comparator;
import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;
/*
比较器排序Comparator的使用
存储学生对象并遍历,创建TreeSet集合使用带参构造方法
要求:按照年龄从小到大排序,年龄相同时,按照姓名的字母顺序排序
结论
用TreeSet集合存储自定义对象,带参构造方法使用的是比较器排序对元素进行排序的
比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(T o1,T o2)方法
重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写
*/
public class Comparabledemo {
public static void main(String[] args) {
//创建集合对象
// TreeSet(Comparator<? super E> comparator) 构造一个新的,空的树集,根据指定的比较器进行排序。
TreeSet<Student> treeSet = new TreeSet<Student>(new Comparator<Student>() {
//采用匿名内部类的方式 因为不知到接口的实现类名字所以用 接口名 进行代替
//实现Comparator接口对compare方法进行重写
@Override
public int compare(Student s1, Student s2) {
// TODO Auto-generated method stub
//这里s1不能访问学生类的私有成员因为封装了,只能通过get方法获取
//this.age - s.age //s1指的是this,s2指的是s
//按照年龄从小到大排序
int num = s1.getAge() - s2.getAge();//这里是调用方法
//年龄相同时,按照姓名的字母顺序排序
int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;
return num2;
}
});//带参构造方法
//创建学生对象
student s1 = new student("wuer", 27);
student s2 = new student("weuers", 250);
student s3 = new student("wcdds", 215);
student s4 = new student("sdew", 295);
student s5 = new student("swdds", 295);
student s6 = new student("wcdds", 215);//保证唯一性
//添加元素
tree.add(s1);
tree.add(s2);
tree.add(s3);
tree.add(s4);
tree.add(s5);//return为0 认为是重复的
tree.add(s6);
//采用迭代器进行遍历
Iterator<student> it = tree.iterator();
while (it.hasNext()) {
student s = it.next();
System.out.println(s.getName() + ",\t" + s.getAge());
//ClassCastException 类转换异常
//在student类中 实现Comparable
//重写Comparable方法
}
System.out.println("---------");
//采用for循环进行遍历
for (student s : tree) {
System.out.println(s.getName() + ",\t" + s.getAge());
}
}
}
结论
用TreeSet集合存储自定义对象,无参构造方法使用的是 自然排序 对元素进行排序的
自然排序,就是让元素所属的类 实现Comparable接口,重写 compareTo(To)方法
重写方法时,一定要注意排序规则必须按照要求的 主要条件 和 次要条件 来写
用TreeSet集合存储自定义对象,带参构造方法使用的是比较器排序对元素进行排序的
比较器排序,就是让集合构造方法接收Comparator的实现类对象,重写compare(T o1,T o2)方法
重写方法时,一定要注意排序规则必须按照要求的主要条件和次要条件来写