TreeSet的俩种排序方法

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;
}

@Override
public 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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值