TreeSet的俩种排序方法

来源:互联网 发布:什么学英文软件 编辑:程序博客网 时间:2024/06/18 17:23

TreeSet的俩种排序方法

分为自然排序和比较器排序

用TreeSet集合存储自定义对象,自定义的队形一定要实现Comparable接口(自然排序),还要在自定义对象的类中重写compareTo方法;Comparator接口(比较器排序)。

自然排序:

 TreeSet<Sdudent>  ts = new TreeSet<Sdudent>();

比较器排序:

 1,TreeSet<Sdudent>  ts = new Tree<Sdudent>(new MyComparator());      MyComparator:为Comparator的子实现类,且需要重写compare方法。 2.(比较常用)匿名内部类的方法    TreeSet<Sdudent>  ts = new TreeSet<> (new Comparartor<Sdudent>(){                                 重写compare方法;                                 });

需求:

 使用TreeSet集合存储自定义对象,并遍历,要求按照姓名的长度进行排序(主要条件)(自然排序)

代码:

 public static void main(String[] args) {    Sdudent s1 = new Sdudent("safsgdfsadf",20);    Sdudent s2 = new Sdudent("dsgeacx",45);    Sdudent s3 = new Sdudent("fdbgxccbvcb",34);    Sdudent s4 = new Sdudent("adgfvdhbgftb",67);    Sdudent s5 = new Sdudent("dvfergcxcbf",20);    Sdudent s6 = new Sdudent("sdfwegfdfcdvszfdvgfd",56);    Sdudent s7 = new Sdudent("asdfregvrtbcfb",76);    TreeSet<Sdudent> ts= new TreeSet<Sdudent>();    ts.add(s1);    ts.add(s2);    ts.add(s3);    ts.add(s4);    ts.add(s5);    ts.add(s6);    ts.add(s7);    for(Sdudent s :ts){        System.out.println(s.getName()+"\t"+s.getAge()+"\t");    }}

Sdudent类:

 public class Sdudent implements Comparable<Sdudent>{ private String name; private int age; public Sdudent(){ } public Sdudent(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;}@Overridepublic int compareTo(Sdudent s) {    int num = this.name.length()-s.name.length();    int num2 =num ==0? this.name.compareTo(s.name):num;    int num3 =num2==0? this.age-s.age :num2;    return num3;}

结果:

dsgeacx 45
dvfergcxcbf 20
fdbgxccbvcb 34
safsgdfsadf 20
adgfvdhbgftb 67
asdfregvrtbcfb 76
sdfwegfdfcdvszfdvgfd 56

需求:

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

代码:

public static void main(String[] args) {       //创建集合对象 用TreeSet集合       TreeSet<Sdudent2> ts=new TreeSet<>(new Comparator<Sdudent2>(){        @Override        public int compare(Sdudent2 o1, Sdudent2 o2) {            int num = o1.getChinese()+o1.getMath()+o1.getEnglish()-                    o2.getChinese()-o2.getEnglish()-o2.getMath();            int num2 =num ==0? o1.getChinese()-o2.getChinese():num;            int num3 =num2 ==0? o1.getMath()-o2.getMath():num2;            int num4 =num3 ==0? o1.getEnglish()-o2.getEnglish():num3;            int num5 = num4 ==0? o1.getName().compareTo(o2.getName()):num4;            return num5;        }       });       //键盘输入       for(int x = 1 ;x<=5;x++){           Scanner sc = new Scanner(System.in);           System.out.println("请输入第"+x+"位学生的信息");           System.out.println("请输入姓名");           String s = sc.nextLine();           System.out.println("请输入语文成绩");           int yw = sc.nextInt();           System.out.println("请输入数学成绩");           int sx = sc.nextInt();           System.out.println("请输入英语成绩");           int yy = sc.nextInt();           //创建学生对象           Sdudent2 ss = new Sdudent2(s,yw,sx,yy);           //添加           ts.add(ss);       }       System.out.println("姓名\t语文成绩\t数学成绩\t英语成绩\t");       for(Sdudent2 s :ts){           System.out.println(s.getName()+"\t"+s.getChinese()+"\t"+s.getMath()           +"\t"+s.getEnglish()+"\t");       }    }

结果:

请输入第1位学生的信息
请输入姓名
张三
请输入语文成绩
77
请输入数学成绩
78
请输入英语成绩
67
请输入第2位学生的信息
请输入姓名
李四
请输入语文成绩
88
请输入数学成绩
83
请输入英语成绩
74
请输入第3位学生的信息
请输入姓名
王五
请输入语文成绩
90
请输入数学成绩
91
请输入英语成绩
67
请输入第4位学生的信息
请输入姓名
赵宇豪
请输入语文成绩
89
请输入数学成绩
88
请输入英语成绩
95
请输入第5位学生的信息
请输入姓名
杨虹
请输入语文成绩
87
请输入数学成绩
99
请输入英语成绩
97
姓名 语文成绩 数学成绩 英语成绩
张三 77 78 67
李四 88 83 74
王五 90 91 67
赵宇豪 89 88 95
杨虹 87 99 97