TreeSet集合的两种排序

来源:互联网 发布:云计算的运用 编辑:程序博客网 时间:2024/06/03 14:14

TreeSet集合的两种排序

      自然排序
  比较器排序

  
  本身就可以实现自然排序和比较器排序,都是通过构造方法进行实现:

1.自然排序:TreeSet() :创建该集合对象:通过无参构造的形式:默认的就是自然排序
需要在当前的类中实现Comparable接口:
实现该接口中的compareTo()方法

代码:
package 两种排序;


//自然排序
public class Student implements Comparable<Student> {
private String name;
private int age;
public Student() {
super();
// TODO Auto-generated constructor stub
}
public Student(String name, int age) {
super();
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;
}
public int compareTo(Student s) {
//主要条件:姓名的长度是否相同
int num=this.name.length()-s.name.length();
//次要条件,年龄是否相同
int num2=num==0?this.age-s.age:num;
//比较姓名的内容是否相同
int num3=num2==0?this.name.compareTo(s.name):num2;
return num3;
}



}
//测试类
package 两种排序;


import java.util.TreeSet;


public class TreeSetTest1 {
public static void main(String[] args) {
//创建TreeSet集合对象
TreeSet<Student> ts=new TreeSet<Student>();
//创建Student对象
Student s1=new Student("习近平",60);
Student s2=new Student("奥巴马",66);
Student s3=new Student("文在寅",60);
Student s4=new Student("奥巴马",55);
Student s5=new Student("特里莎梅",63);
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
//遍历
for(Student s:ts){
System.out.println(s.getName()+","+s.getAge());
}
}
}



2.比较器排序:
TreeSet(Comparator<T> comparator):里面参数是一个接口的形式
两种方式:
1)自定义一个类实现Comparator接口,实现接口中的compare()方法
2)匿名内部类的方式:实际开发中使用

比如:
TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {


@Override
public int compare(Student s1, Student s2) {
//主要条件:按照姓名的长度进行
/**
 * 回想自然排序里面comparTo(Student s)
 *  this.name.length----->s1
 *  s.name.length------>s2
 * 
 * */

int num = s1.getName().length() - s2.getName().length() ;
//次要条件:姓名的长度相同,不一定年龄相同
int num2 = num==0? s1.getAge()-s2.getAge() : num ;
//姓名长度一样,年龄一样,不一定姓名的内容一样
int num3 = num2==0? s1.getName().compareTo(s2.getName()) : num2 ;
return num3;
}
});

代码:
package 两种排序;


import java.util.TreeSet;
//比较器排序
public class TreeSetTest1 {
public static void main(String[] args) {
//创建TreeSet集合对象
TreeSet<Student> ts=new TreeSet<Student>();
//创建Student对象
Student s1=new Student("习近平",60);
Student s2=new Student("奥巴马",66);
Student s3=new Student("文在寅",60);
Student s4=new Student("奥巴马",55);
Student s5=new Student("特里莎梅",63);
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
//遍历
for(Student s:ts){
System.out.println(s.getName()+","+s.getAge());
}
}
}
//测试类
package 两种排序;


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


public class TreeSetTest2 {
public static void main(String[] args) {
//创建TreeSet集合对象,匿名内部类
TreeSet<Student2> ts=new TreeSet<Student2>(new Comparator<Student2>(){


@Override
public int compare(Student2 s1, Student2 s2) {
// TODO Auto-generated method stub
//主要条件:比较名字的年龄是否相同
int num=s1.getAge()-s2.getAge();
//次要条件,年龄相同再比较名字的内容是否相同
int num2=num==0?s2.getName().compareTo(s1.getName()):num;
return num2;
}

});
//创建Student对象
Student2 s1=new Student2("习近平",60);
Student2 s2=new Student2("奥巴马",66);
Student2 s3=new Student2("文在寅",60);
Student2 s4=new Student2("奥巴马",55);
Student2 s5=new Student2("特里莎梅",63);
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
//遍历
for(Student2 s:ts){
System.out.println(s.getName()+","+s.getAge());
}
}

}


3.练习
键盘录入5个学生信息(姓名,语文成绩,数学成绩,英语成绩),按照总分从高到低
输出到控制台


分析:1)创建TreeSet集合对象
2)如何实现总分从高到低?
3)存储5个学生到集合中:for循环存储
4)遍历集合中的元素信息

代码:
package 两种排序;


public class Student3 {
private String name;
private int chinese;
private int math;
private int english;
public Student3() {
super();
// TODO Auto-generated constructor stub
}
public Student3(String name, int chinese, int math, int english) {
super();
this.name = name;
this.chinese = chinese;
this.math = math;
this.english = english;
}
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 getEnglish() {
return english;
}
public void setEnglish(int english) {
this.english = english;
}
public int getSum(){
return this.chinese +this.math+this.english;
}


}
//测试类
import java.util.Comparator;
import java.util.Scanner;
import java.util.TreeSet;


public class TreeSetTest3 {
public static void main(String[] args) {
//创建TreeSet集合对象
TreeSet<Student3> ts=new TreeSet<Student3>(new Comparator<Student3>(){


@Override
public int compare(Student3 s1, Student3 s2) {
// TODO Auto-generated method stub
//成绩总分从高到低排序
int num=s2.getSum()-s1.getSum();
//总分一样,语文成绩不一样
int num2=num==0?s2.getChinese()-s1.getChinese():num;
//总分一样,语文成绩一样,数学成绩不一样
int num3=num2==0?s2.getMath()-s1.getMath():num2;
//总分一样,语数外一样,名字不一样
int num4=num3==0?s2.getName().compareTo(s1.getName()):num3;
return num4;
}

});


//键盘录入5个学生的信息,为了方便:键盘录入的每一个数据:都是String类型
System.out.println("录入学习信息开始:");
for(int x = 1 ; x <=5 ; x ++){
//创建键盘录入对象
Scanner sc = new Scanner(System.in) ;
System.out.println("请输入第:"+x+"个学生的姓名:");
String name = sc.nextLine() ;
System.out.println("请输入第:"+x+"个学生的语文成绩:");
String chineseString = sc.nextLine() ;
System.out.println("请输入第:"+x+"个学生的数学成绩:");
String mathString =sc.nextLine() ;
System.out.println("请输入第:"+x+"个学生的英语成绩:");
String englishString = sc.nextLine();

//将这些学生信息封装到学生对象中
Student3 s = new Student3() ;
s.setName(name) ;
s.setChinese(Integer.parseInt(chineseString)) ;
s.setMath(Integer.parseInt(mathString)) ;
s.setEnglish(Integer.parseInt(englishString)) ;


//将学生对象添加集合中
ts.add(s) ;
}

System.out.println("录入学生信息完毕,信息如下:");
System.out.println("姓名\t语文成绩\t数学成绩\t英语成绩:");

//遍历:
for(Student3 s:ts){
System.out.println(s.getName()+"\t"+s.getChinese()+"\t"+
s.getMath()+"\t"+s.getEnglish());
}
}
}