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、可以使用多种排序标准,比如升序、降序等

  • 相关阅读:
    我爱java系列之---【微服务间的认证—Feign拦截器】
    我爱java系列之---【设置权限的三种解决方案】
    581. Shortest Unsorted Continuous Subarray
    129. Sum Root to Leaf Numbers
    513. Find Bottom Left Tree Value
    515. Find Largest Value in Each Tree Row
    155. Min Stack max stack Maxpop O(1) 操作
    painting house
    Minimum Adjustment Cost
    k Sum
  • 原文地址:https://www.cnblogs.com/cy163/p/1450298.html
Copyright © 2011-2022 走看看