自然排序Comparable的使用
-
案例需求
- 存儲(chǔ)學(xué)生對(duì)象并遍歷,創(chuàng)建TreeSet集合使用無參構(gòu)造方法
- 要求:按照年齡從小到大排序,年齡相同時(shí),按照姓名的字母順序排序
-
實(shí)現(xiàn)步驟文章來源:http://www.zghlxwxcb.cn/news/detail-471861.html
- 使用空參構(gòu)造創(chuàng)建TreeSet集合
- 用TreeSet集合存儲(chǔ)自定義對(duì)象,無參構(gòu)造方法使用的是自然排序?qū)υ剡M(jìn)行排序的
- 自定義的Student類實(shí)現(xiàn)Comparable接口
- 自然排序,就是讓元素所屬的類實(shí)現(xiàn)Comparable接口,重寫compareTo(T o)方法
- 重寫接口中的compareTo方法
- 重寫方法時(shí),一定要注意排序規(guī)則必須按照要求的主要條件和次要條件來寫
- 使用空參構(gòu)造創(chuàng)建TreeSet集合
-
代碼實(shí)現(xiàn)文章來源地址http://www.zghlxwxcb.cn/news/detail-471861.html
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;
}
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 String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int compareTo(Student o) {
//按照對(duì)象的年齡進(jìn)行排序
//主要判斷條件: 按照年齡從小到大排序
int result = this.age - o.age;
//次要判斷條件: 年齡相同時(shí),按照姓名的字母順序排序
result = result == 0 ? this.name.compareTo(o.getName()) : result;
return result;
}
}
public class MyTreeSet2 {
public static void main(String[] args) {
//創(chuàng)建集合對(duì)象
TreeSet<Student> ts = new TreeSet<>();
//創(chuàng)建學(xué)生對(duì)象
Student s1 = new Student("zhangsan",28);
Student s2 = new Student("lisi",27);
Student s3 = new Student("wangwu",29);
Student s4 = new Student("zhaoliu",28);
Student s5 = new Student("qianqi",30);
//把學(xué)生添加到集合
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
//遍歷集合
for (Student student : ts) {
System.out.println(student);
}
}
}
比較器排序Comparator的使用
-
案例需求
- 存儲(chǔ)老師對(duì)象并遍歷,創(chuàng)建TreeSet集合使用帶參構(gòu)造方法
- 要求:按照年齡從小到大排序,年齡相同時(shí),按照姓名的字母順序排序
-
實(shí)現(xiàn)步驟
- 用TreeSet集合存儲(chǔ)自定義對(duì)象,帶參構(gòu)造方法使用的是比較器排序?qū)υ剡M(jìn)行排序的
- 比較器排序,就是讓集合構(gòu)造方法接收Comparator的實(shí)現(xiàn)類對(duì)象,重寫compare(T o1,T o2)方法
- 重寫方法時(shí),一定要注意排序規(guī)則必須按照要求的主要條件和次要條件來寫
-
代碼實(shí)現(xiàn)
public class Teacher {
private String name;
private int age;
public Teacher() {
}
public Teacher(String name, int age) {
this.name = name;
this.age = age;
}
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 String toString() {
return "Teacher{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
public class MyTreeSet4 {
public static void main(String[] args) {
//創(chuàng)建集合對(duì)象
TreeSet<Teacher> ts = new TreeSet<>(new Comparator<Teacher>() {
@Override
public int compare(Teacher o1, Teacher o2) {
//o1表示現(xiàn)在要存入的那個(gè)元素
//o2表示已經(jīng)存入到集合中的元素
//主要條件
int result = o1.getAge() - o2.getAge();
//次要條件
result = result == 0 ? o1.getName().compareTo(o2.getName()) : result;
return result;
}
});
//創(chuàng)建老師對(duì)象
Teacher t1 = new Teacher("zhangsan",23);
Teacher t2 = new Teacher("lisi",22);
Teacher t3 = new Teacher("wangwu",24);
Teacher t4 = new Teacher("zhaoliu",24);
//把老師添加到集合
ts.add(t1);
ts.add(t2);
ts.add(t3);
ts.add(t4);
//遍歷集合
for (Teacher teacher : ts) {
System.out.println(teacher);
}
}
}
兩種比較方式總結(jié)
- 兩種比較方式小結(jié)
- 自然排序: 自定義類實(shí)現(xiàn)Comparable接口,重寫compareTo方法,根據(jù)返回值進(jìn)行排序
- 比較器排序: 創(chuàng)建TreeSet對(duì)象的時(shí)候傳遞Comparator的實(shí)現(xiàn)類對(duì)象,重寫compare方法,根據(jù)返回值進(jìn)行排序
- 在使用的時(shí)候,默認(rèn)使用自然排序,當(dāng)自然排序不滿足現(xiàn)在的需求時(shí),必須使用比較器排序
- 兩種方式中關(guān)于返回值的規(guī)則
- 如果返回值為負(fù)數(shù),表示當(dāng)前存入的元素是較小值,存左邊
- 如果返回值為0,表示當(dāng)前存入的元素跟集合中元素重復(fù)了,不存
- 如果返回值為正數(shù),表示當(dāng)前存入的元素是較大值,存右邊
到了這里,關(guān)于java自然排序Comparable和比較器排序Comparator的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!