zoukankan      html  css  js  c++  java
  • Arrays.sort 不区分大小写 排序

    当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序。

    一、Comparator

    强行对某个对象collection进行整体排序的比较函数,可以将Comparator传递给Collections.sortArrays.sort

    接口方法:

    Java代码 复制代码
    1. /**  
    2.  * @return o1小于、等于或大于o2,分别返回负整数、零或正整数。  
    3.  */  
    4. int compare(Object o1, Object o2);  
      /**
       * @return o1小于、等于或大于o2,分别返回负整数、零或正整数。
       */
      int compare(Object o1, Object o2);



    案例:

    Java代码 复制代码
    1. import java.util.Arrays;   
    2. import java.util.Comparator;   
    3.   
    4. public class SampleComparator implements Comparator {   
    5.   
    6.   public int compare(Object o1, Object o2) {   
    7.     return toInt(o1) - toInt(o2);   
    8.   }   
    9.   
    10.   private int toInt(Object o) {   
    11.     String str = (String) o;   
    12.     str = str.replaceAll("一""1");   
    13.     str = str.replaceAll("二""2");   
    14.     str = str.replaceAll("三""3");   
    15.     //    
    16.     return Integer.parseInt(str);   
    17.   }   
    18.   
    19.   /**  
    20.    * 测试方法  
    21.    */  
    22.   public static void main(String[] args) {   
    23.     String[] array = new String[] { "一二""三""二" };   
    24.     Arrays.sort(array, new SampleComparator());   
    25.     for (int i = 0; i < array.length; i++) {   
    26.       System.out.println(array[i]);   
    27.     }   
    28.   }   
    29.   
    30. }  
    import java.util.Arrays;
    import java.util.Comparator;
    
    public class SampleComparator implements Comparator {
    
      public int compare(Object o1, Object o2) {
        return toInt(o1) - toInt(o2);
      }
    
      private int toInt(Object o) {
        String str = (String) o;
        str = str.replaceAll("一", "1");
        str = str.replaceAll("二", "2");
        str = str.replaceAll("三", "3");
        // 
        return Integer.parseInt(str);
      }
    
      /**
       * 测试方法
       */
      public static void main(String[] args) {
        String[] array = new String[] { "一二", "三", "二" };
        Arrays.sort(array, new SampleComparator());
        for (int i = 0; i < array.length; i++) {
          System.out.println(array[i]);
        }
      }
    
    }


    二、Comparable

    强行对实现它的每个类的对象进行整体排序,实现此接口的对象列表(和数组)可以通过Collections.sortArrays.sort进行自动排序。

    接口方法:

    Java代码 复制代码
    1. /**  
    2.  * @return 该对象小于、等于或大于指定对象o,分别返回负整数、零或正整数。   
    3.  */  
    4. int compareTo(Object o);  
      /**
       * @return 该对象小于、等于或大于指定对象o,分别返回负整数、零或正整数。 
       */
      int compareTo(Object o);


    假设对象User,需要按年龄排序:

    Java代码 复制代码
    1. public class User {   
    2.   
    3.   private String id;   
    4.   private int age;   
    5.   
    6.   public User(String id, int age) {   
    7.     this.id = id;   
    8.     this.age = age;   
    9.   }   
    10.   
    11.   public int getAge() {   
    12.     return age;   
    13.   }   
    14.   
    15.   public void setAge(int age) {   
    16.     this.age = age;   
    17.   }   
    18.   
    19.   public String getId() {   
    20.     return id;   
    21.   }   
    22.   
    23.   public void setId(String id) {   
    24.     this.id = id;   
    25.   }   
    26.   
    27. }  
    public class User {
    
      private String id;
      private int age;
    
      public User(String id, int age) {
        this.id = id;
        this.age = age;
      }
    
      public int getAge() {
        return age;
      }
    
      public void setAge(int age) {
        this.age = age;
      }
    
      public String getId() {
        return id;
      }
    
      public void setId(String id) {
        this.id = id;
      }
    
    }


    改造后的对象:

    Java代码 复制代码
    1. import java.util.Arrays;   
    2.   
    3. public class User implements Comparable {   
    4.   
    5.   private String id;   
    6.   private int age;   
    7.   
    8.   public User(String id, int age) {   
    9.     this.id = id;   
    10.     this.age = age;   
    11.   }   
    12.   
    13.   public int getAge() {   
    14.     return age;   
    15.   }   
    16.   
    17.   public void setAge(int age) {   
    18.     this.age = age;   
    19.   }   
    20.   
    21.   public String getId() {   
    22.     return id;   
    23.   }   
    24.   
    25.   public void setId(String id) {   
    26.     this.id = id;   
    27.   }   
    28.   
    29.   public int compareTo(Object o) {   
    30.     return this.age - ((User) o).getAge();   
    31.   }   
    32.   
    33.   /**  
    34.    * 测试方法  
    35.    */  
    36.   public static void main(String[] args) {   
    37.     User[] users = new User[] { new User("a"30), new User("b"20) };   
    38.     Arrays.sort(users);   
    39.     for (int i = 0; i < users.length; i++) {   
    40.       User user = users[i];   
    41.       System.out.println(user.getId() + " " + user.getAge());   
    42.     }   
    43.   }   
    44.   
    45. }  
    import java.util.Arrays;
    
    public class User implements Comparable {
    
      private String id;
      private int age;
    
      public User(String id, int age) {
        this.id = id;
        this.age = age;
      }
    
      public int getAge() {
        return age;
      }
    
      public void setAge(int age) {
        this.age = age;
      }
    
      public String getId() {
        return id;
      }
    
      public void setId(String id) {
        this.id = id;
      }
    
      public int compareTo(Object o) {
        return this.age - ((User) o).getAge();
      }
    
      /**
       * 测试方法
       */
      public static void main(String[] args) {
        User[] users = new User[] { new User("a", 30), new User("b", 20) };
        Arrays.sort(users);
        for (int i = 0; i < users.length; i++) {
          User user = users[i];
          System.out.println(user.getId() + " " + user.getAge());
        }
      }
    
    }



    三、Comparator和Comparable的区别

    先看一下使用Comparator对User集合实现排序的方式:

    Java代码 复制代码
    1. import java.util.Arrays;   
    2. import java.util.Comparator;   
    3.   
    4. public class UserComparator implements Comparator {   
    5.   
    6.   public int compare(Object o1, Object o2) {   
    7.     return ((User) o1).getAge() - ((User) o2).getAge();   
    8.   }   
    9.   
    10.   /**  
    11.    * 测试方法  
    12.    */  
    13.   public static void main(String[] args) {   
    14.     User[] users = new User[] { new User("a"30), new User("b"20) };   
    15.     Arrays.sort(users, new UserComparator());   
    16.     for (int i = 0; i < users.length; i++) {   
    17.       User user = users[i];   
    18.       System.out.println(user.getId() + " " + user.getAge());   
    19.     }   
    20.   }   
    21.   
    22. }  
    import java.util.Arrays;
    import java.util.Comparator;
    
    public class UserComparator implements Comparator {
    
      public int compare(Object o1, Object o2) {
        return ((User) o1).getAge() - ((User) o2).getAge();
      }
    
      /**
       * 测试方法
       */
      public static void main(String[] args) {
        User[] users = new User[] { new User("a", 30), new User("b", 20) };
        Arrays.sort(users, new UserComparator());
        for (int i = 0; i < users.length; i++) {
          User user = users[i];
          System.out.println(user.getId() + " " + user.getAge());
        }
      }
    
    }


    一个类实现了Camparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。
    Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用:
    1、类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身
    2、可以使用多种排序标准,比如升序、降序等

  • 相关阅读:
    不使用border-radius,实现一个可复用的高度和宽度都自适应的圆角矩形
    实现一个div在浏览器水平居中
    HTML画布(2)
    《10X工作法制》笔记
    消息体的上传格式
    在rpc链路中的工作总结
    同属姓名注入spring报错
    《事实》听后感
    jdk8使用stream对指定值去重以及其他stream用法
    如何写好业务(待续)
  • 原文地址:https://www.cnblogs.com/cy163/p/1450298.html
Copyright © 2011-2022 走看看