java中的排序功能小结(非算法)

Arrays.sort()

基本数据类型数组的排序:一般按升序排,可指定排序的范围

    static void sort(int[] a) 
              对指定的 int 型数组按数字升序进行排序。 
    static void sort(int[] a, int fromIndex, int toIndex) 
              对指定 int 型数组的指定范围按数字升序进行排序。 

    对象数组的排序1:按元素的自然顺序,需要参与排序的元素自身具备比较性,即实现 Comparable 接口,复写compareTo方法,也就是按compareTo方法中指定的顺序排序。

      static void sort(Object[] a) 
                根据元素的自然顺序对指定对象数组按升序进行排序。 
      static void sort(Object[] a, int fromIndex, int toIndex) 
                根据元素的自然顺序对指定对象数组的指定范围按升序进行排序。 

      对象数组的排序2:按指定的顺序排序:在比较器中定义怎么排法

      static < T> void  sort(T[] a, Comparator<? super T> c) 
                根据指定比较器产生的顺序对指定对象数组进行排序。 
      static < T> void sort(T[] a, int fromIndex, int toIndex, Comparator<? super T> c) 
                根据指定比较器产生的顺序对指定对象数组的指定范围进行排序。 

      总结:基本数据类型的升序排序近似第二种自然顺序排序,也就是说,数组的sort方法就定义了两种排序方式:一种是按数据结构内部定义好规则的排序,另一种把排序的规则抽离,算法与数据结构分家后,单独封装,降低耦合性,提高自由度。

      Collections.sort()

      如上所述,Collections工具类中排序方法就提供这两种,都是对List进行的排序。

      static <T extends Comparable<? super T>> void  sort(List<T> list) 
                根据元素的自然顺序 对指定列表按升序进行排序。 
      static <T> void  sort(List<T> list, Comparator<? super T> c) 
                根据指定比较器产生的顺序对指定列表进行排序。

      TreeSet

      该集合底层用二叉树而实现了其内元素的排序功能。

      构造方法如下:
      可以自己add元素,可以由其他集合转换过来,也可以自己定义比较器

      TreeSet() 
                构造一个新的空 set,该 set 根据其元素的自然顺序进行排序。 
      TreeSet(Collection<? extends E> c) 
                构造一个包含指定 collection 元素的新 TreeSet,它按照其元素的自然顺序进行排序。 
      TreeSet(Comparator<? super E> comparator) 
                构造一个新的空 TreeSet,它根据指定比较器进行排序。 
      

      还有一个获得比较器的方法:

       Comparator<? super E>   comparator() 
                返回对此 set 中的元素进行排序的比较器;如果此 set 使用其元素的自然顺序,则返回 null

      Comparable与Comparator的比较

      由上可见,要对对象进行排序,

      • 要么对象本身要有比较性:比如基本数据类型,String类型等,或者自定义的类实现Comparable接口并复写compareTo方法;
        或者针对要排序的对象专门定义一个比较器:自定义一个类并实现Comparator,复写compare方法
        自定义比较器

      代码演示1:实现Comparable接口

      • 注意compareTo方法:

      int compareTo(T o) 
                比较此对象与指定对象的顺序。 
      参数:
          o - 要比较的对象。 
      返回:
          负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。 
      抛出: 
          ClassCastException - 如果指定对象的类型不允许它与此对象进行比较。
      class User implements Comparable<User>//采用泛型
      {
          private String name;
          private int age;
      
          public User(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;
          }
      
          public int compareTo(User u) //按年龄倒序排序,如果年龄相同则按名字的自然顺序排序
          {
              if(this.age==u.getAge())
                  return(this.name.compareTo(u.getName()));//this(本对象)在前,表示按升序排序
              else
                  return (u.getAge()-this.age);//this在后,表示按降序
          }
      
      }

      代码演示2:自定义比较器:

      有两个方法:compare、equals,但只重写compare方法。

       int compare(T o1, T o2) 
                比较用来排序的两个参数。
       参数:
          o1 - 要比较的第一个对象。
          o2 - 要比较的第二个对象。 
      返回:
          根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。 
      抛出: 
          ClassCastException - 如果参数的类型不允许此 Comparator 对它们进行比较。
      
      
      class MyCompare implements Comparator<User>
      {
          public int compare(User u1,User u2)
          {
              if(u1.getName().equals(u2.getName()))
                  return (u1.getAge()-u2.getAge());
              else
                  return (u1.getName().compareTo(u2.getName()));
          }
      }
      
      TreeSet<User> ts = new TreeSet<User>(new MyCompare());//让TreeSet按MyCompare中顺序排序
      
      //或者,原先User对象加入了List中,且内部没有定义比较方法,那么可使用
      
      ArrayList<User> al = new ArrayList<User>();
      Collections.sort(al,new MyCompare());

      思考:HashSet怎么排序?

      内部元素本身是否有比较性?
      本身有的话,那好办,用TreeSet来接收即可。
      元素本身没有定义比较性的话,就自定义一个比较器,再用将HashSet中元素存入到TreeSet或List集合中。

      总之,要将元素放到另一个集合中,HashSet集合本身是无法排序的。

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

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

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

      请填写红包祝福语或标题

      红包个数最小为10个

      红包金额最低5元

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

      抵扣说明:

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

      余额充值