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

  • 相关阅读:
    数据结构-树与二叉树-思维导图
    The last packet successfully received from the server was 2,272 milliseconds ago. The last packet sent successfully to the server was 2,258 milliseconds ago.
    idea连接mysql报错Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' property
    redis学习笔记
    AJAX校验注册用户名是否存在
    AJAX学习笔记
    JSON学习笔记
    JQuery基础知识学习笔记
    Filter、Listener学习笔记
    三层架构学习笔记
  • 原文地址:https://www.cnblogs.com/cy163/p/1450298.html
Copyright © 2011-2022 走看看