• Java-小技巧-006 List 排序 Collections.sort()


    一、数组操作类:Arrays

    最早开始使用,查看方法
    二分查找:public static int binarySearch(数据类型[] a, 数据类型 key)
      前提是有序的
      equals
      先排序
      fill
      sort:直接针对对象数据进行排序
      toString(数据类型【】 a)

    二、两种比较器的使用:

      Comparable接口、Comparator接口

    2.1、Comparable【核心】

    方法:public static void sort(Object【】a)

      此方法可以直接对对向数据数组进行排序,并不是意味着直接调用此方法即可,java.lang.ClassCastException: com.lhx.thread.impl.Person1 cannot be cast to java.lang.Comparable

      需要解决对象大小关系问题,然而对象无法区分出大小关系,Java会自动在排序的时候将所有的对象强制转换为Comparable接口

      要想实现对象数组的排序,那么对象所在的类一定要实现Comparable接口  

    public interface Comparable<T> { 
        public int compareTo(T o);
    }

      

      String中的CompareTo方法本身就是覆写了Comparable接口中的compareTo(),需要排序返回三个值即可 -1、0、1
    示例:

    class Person1 implements Comparable<Person1> {
        @Override
        public int compareTo(Person1 o) {
            if(this.age>o.age)
                return 1; //升序 -1 降序 
            else if (this.age<o.age)
                return -1;
            return 0;
        }
    }
    Arrays.sort(per);        

    代码简化

    class Person1 implements Comparable<Person1> {
        @Override
        public int compareTo(Person1 o) {
            return this.age-o.age; //正负数即可
        }
    }
    Arrays.sort(per);

    2.2、Comparator挽救的比较器

    要想对对象进行排序,那么就要实现Comparable接口,但是有一种情况,一个类原本定义完成了,后期确需要追加排序,并且这个类已经不能修改了。那么这种情况下使用java.util.Compartor

    @FunctionalInterface
    public interface Comparator<T> {
        int compare(T o1, T o2);
        boolean equals(Object obj);
    }

    使用Arrays的public static <T> void sort(T[] a, Comparator<? super T> c) 

    示例:

    class Person3 {
        private String name;
        private int age;
        public Person3(String name , int age){
            this.name=name;
            this.age=age;
        }
        //setter,getter
        @Override
        public String toString() {
            return "Person3 [name=" + name + ", age=" + age + "]";
        }    
    }
    class PersonComparator implements Comparator<Person3> {
        @Override
        public int compare(Person3 o1, Person3 o2) {
            return o1.getAge()-o2.getAge();
        }
    }
    
    public class TestArrays2 {
    
        @Test
        public void testMath() {
            // Person不能被改变
            Person3 per[] =new Person3[]{
                new Person3("张三1",65),
                new Person3("张三2",12),
                new Person3("张三3",16)
            };
            Arrays.sort(per,new PersonComparator());
            System.out.println(Arrays.toString(per));
        }
    }    
    View Code

    简化写法

    不用定义比较器类。直接使用时候编写

    class Person3 {
        private String name;
        private int age;
        public Person3(String name , int age){
            this.name=name;
            this.age=age;
        }
        //setter,getter
        @Override
        public String toString() {
            return "Person3 [name=" + name + ", age=" + age + "]";
        }    
    }
    public class TestArrays2 {
    
        @Test
        public void testMath() {
            // Person不能被改变
            Person3 per[] =new Person3[]{
                new Person3("张三1",65),
                new Person3("张三2",12),
                new Person3("张三3",16)
            };
            Arrays.sort(per,new Comparator<Person3 >(){
                    @Override
                        public int compare(Person3 o1, Person3 o2) {
                            return o1.getAge()-o2.getAge();
                        }
            });
            System.out.println(Arrays.toString(per));
        }
    }
    View Code

    请解释两种比较器的区别

    1.对象排序过程中有两个Comparable和Comparator
    2.java.lang.Comparable是在类定义的时候实现好的接口,使用compareTo
    3.java.util.Comparator:需要顶一个排序比较规则类,里面有两个方法compare、equals
    开发中优先考虑使用Comparable。


    如果要按照升序排序,
    则o1 小于o2,返回-1(负数),相等返回0,01大于02返回1(正数)
    如果要按照降序排序
     则o1 小于o2,返回1(正数),相等返回0,01大于02返回-1(负数)

    示例一、字符串集合排序

        public static void main(String args[]){
            List<String> list = new ArrayList<>();
            list.add("51003");
            list.add("510020");
            list.add("");
            list.add(null);
            list.add("510060");
            Collections.sort(list,new Comparator<String>() {
                @Override
                public int compare(String o1, String o2) {
                    if(o1 == null || o2 == null){
                        return -1;
                    }
                    if(o1.length() > o2.length()){
                        return 1;
                    }
                    if(o1.length() < o2.length()){
                        return -1;
                    }
                    if(o1.compareTo(o2) > 0){
                        return 1;
                    }
                    if(o1.compareTo(o2) < 0){
                        return -1;
                    }
                    if(o1.compareTo(o2) == 0){
                        return 0;
                    }
                    return 0;
                }
            });
            for(String s:list){
                System.out.println(s);
            }
        }
    View Code

    实例二、JSONArray中嵌套JSONObject, 对JSONArray进行排序

    排序前:

    [{"id":1,"name":"ljw"},{"id":3,"name":"ljw"},{"id":2,"name":"ljw"}]

    排序后:

    [{"id":1,"name":"ljw"},{"id":2,"name":"ljw"},{"id":3,"name":"ljw"}]

    利用Collections.sort()

    JSONObject o1 = JSONObject.parseObject("{"id":1,"name":"ljw"}");
    JSONObject o2 = JSONObject.parseObject("{"id":3,"name":"ljw"}");
    JSONObject o3 = JSONObject.parseObject("{"id":2,"name":"ljw"}");
    JSONArray a = new JSONArray();
    a.add(o1);
    a.add(o2);
    a.add(o3);
    //转list 1
    List<JSONObject> list = JSONArray.parseArray(a.toJSONString(), JSONObject.class);
    //转list 2
    //List<JSONObject> list = new ArrayList<JSONObject>();
    //for (int i = 0; i < a.size(); i++) {
    //    list.add((JSONObject) a.get(i));
    //}
    System.out.println("排序前:"+a);
    Collections.sort(list, new Comparator<JSONObject>() {
        @Override
        public int compare(JSONObject o1, JSONObject o2) {
            int a = o1.getInteger("id");
            int b = o2.getInteger("id");
            if (a > b) {
                return 1;
            } else if(a == b) {
                return 0;
            } else
                return -1;
            }
    });
    JSONArray jsonArray = JSONArray.parseArray(list.toString());
    System.out.println("排序后:" + jsonArray);
    View Code
  • 相关阅读:
    Wix 安装部署教程(七) 获取管理员权限
    【异常处理_iis】无法启动IIS Expressiisexpress.exe
    记一次Url重写_发布之后iis 404
    $.ajax 跨域请求 Web Api
    转手项目二三事
    【吉光片羽】之 Web API
    Failed to execute goal org.mortbay.jetty:maven-jetty-plugin
    eclipse解决editor does not contain a main type的方法
    linux 网卡eth0检测时没有IP地址,怎么回事??
    div+css 和 xhtml+css是一回事么?
  • 原文地址:https://www.cnblogs.com/bjlhx/p/8269523.html
Copyright © 2020-2023  润新知