zoukankan      html  css  js  c++  java
  • 1.java中Comparor与Comparable的问题

    1.Comparator中compare()与Comparable中compareTo()方法的区别

      Treeset集合创建对象后,

        A:如果是空构造,即TreeSet<Student> ts = new TreeSet<Student>();  ,那么ts.add();,时需要在Student上implements Comparable<Student>接口,在下面重写compareTo()方法,因为此时的add()调用的是compareTo()方法,底层以红黑二叉树,判断之后,排序

        B:如果是带参构造,即TreeSet<Student> ts = new TreeSet<Student>(Comparator<? super E>comparator); ,ts.add()时,需要自己写个MyComparator类implements Comparator<Student>接口,(如果调用的较少的话,可以在创建对象的时候,以内部类的形式重写方法)或者在在MyComparator中重写compare()方法.

      C:未解决的问题:为什么把

    int num = s1.getName().length() - s2.getName().length();
    (二叉树,左中右顺序)
    s1与s2换个位置之后,就会倒着排序了,二叉树里,不是大的放在右边吗?
    而且换个位置之后根节点还是第一个数吗?如果是的话,那么判断的时候
    数是像哪样呢?

     1 import java.util.Comparator;
     2 import java.util.TreeSet;
     3 
     4 /*
     5  * 需求:按照姓名的长度排序
     6  * 
     7  * public TreeSet(Comparator<? super E> comparator):构造一个新的空 TreeSet,它根据指定比较器进行排序。
     8  */
     9 public class TreeSetDemo {
    10     public static void main(String[] args) {
    11         // 创建集合对象
    12         // TreeSet<Student> ts = new TreeSet<Student>();
    13         // 比较器排序
    14         // TreeSet<Student> ts = new TreeSet<Student>(new MyComparator());
    15         // 内部类的形式
    16         TreeSet<Student> ts = new TreeSet<Student>(new Comparator<Student>() {
    17             @Override
    18             public int compare(Student s1, Student s2) {
    19                 // 按照姓名的长度排序
    20                 int num = s1.getName().length() - s2.getName().length();
    21                 // 当姓名的长度相同时,判断姓名是否相等
    22                 int num2 = num == 0 ? s1.getName().compareTo(s2.getName())
    23                         : num;
    24                 // 当姓名相同时,判断年龄是否相等
    25                 int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;
    26                 return num3;
    27             }
    28         });
    29         // 创建学生对象
    30         Student s1 = new Student("小fsd名", 12);
    31         Student s2 = new Student("小sdf白", 22);
    32         Student s3 = new Student("小sf黑", 33);
    33         Student s4 = new Student("小菜", 13);
    34         Student s5 = new Student("小黑", 33);
    35         Student s6 = new Student("小sdfsdfc", 13);
    36         Student s7 = new Student("小dsfsd黑黑", 33);
    37         Student s8 = new Student("小sfsd菜", 122);
    38         Student s9 = new Student("小黑", 33);
    39         Student s10 = new Student("小c", 13);
    40 
    41         // 添加元素
    42         ts.add(s1);
    43         ts.add(s2);
    44         ts.add(s3);
    45         ts.add(s4);
    46         ts.add(s5);
    47         ts.add(s6);
    48         ts.add(s7);
    49         ts.add(s8);
    50         ts.add(s9);
    51         ts.add(s10);
    52 
    53         // 遍历元素
    54         for (Student s : ts) {
    55             System.out.println(s);
    56         }
    57     }
    58 }
     1 import java.util.Comparator;
     2 
     3 public class MyComparator implements Comparator<Student> {
     4 
     5     @Override
     6     public int compare(Student s1, Student s2) {
     7         // 按照姓名的长度排序
     8         int num = s1.getName().length() - s2.getName().length();
     9         // 当姓名的长度相同时,判断姓名是否相等
    10         int num2 = num == 0 ? s1.getName().compareTo(s2.getName()) : num;
    11         // 当姓名相同时,判断年龄是否相等
    12         int num3 = num2 == 0 ? s1.getAge() - s2.getAge() : num2;
    13         return num3;
    14     }
    15 
    16 }
     1 //或者public class Student implements Comparable
     2 public class Student {
     3     // 姓名
     4     private String name;
     5     // 年龄
     6     private int age;
     7 
     8     public Student() {
     9         super();
    10     }
    11 
    12     public Student(String name, int age) {
    13         super();
    14         this.name = name;
    15         this.age = age;
    16     }
    17 
    18     public String getName() {
    19         return name;
    20     }
    21 
    22     public void setName(String name) {
    23         this.name = name;
    24     }
    25 
    26     public int getAge() {
    27         return age;
    28     }
    29 
    30     public void setAge(int age) {
    31         this.age = age;
    32     }
    33 
    34     @Override
    35     public String toString() {
    36         return "Student [name=" + name + ", age=" + age + "]";
    37     }
    38 
    39     // @Override
    40     // public int compareTo(Student s) {
    41     // // 按照姓名的长度排序
    42     // int num = this.name.length() - s.name.length();
    43     // // 当姓名的长度相同时,判断姓名是否相等
    44     // int num2 = num == 0 ? this.getName().compareTo(s.getName()) : num;
    45     // // 当姓名相同时,判断年龄是否相等
    46     // int num3 = num2 == 0 ? this.getAge() - this.getAge() : num2;
    47     // return num3;
    48     // }
    49 }
  • 相关阅读:
    Centos6.7 编译安装 MySQL教程
    python os os.path模块学习笔记
    Ubuntu无线转有线教程
    k8s 部署kube-dns
    k8s-应用快速入门(ma)
    kubectl工具管理应用生命周期
    k8s-部署WEB-UI(dashboard)
    k8s-集群状态及部署一个实例
    k8s-创建node节点kubeconfig配置文件
    k8s-flannel容器集群网络部署
  • 原文地址:https://www.cnblogs.com/tumio/p/4401860.html
Copyright © 2011-2022 走看看