zoukankan      html  css  js  c++  java
  • java排序之Collections.sort()和Arrays.sort()用法详解

    注:Collections.sort()和Arrays.sort()排序是按ASCII码进行排序的,关于ASCII码相关的可自行百度,String字符串和ASCII之间的转化可参考

    https://www.cnblogs.com/damoblog/p/14386269.html

    一、Collections.sort()排序

        1. 若需要排序的元素实现了Comparable接口,则可以直接使用Colletions.sort()或者Arrays.sort()进行排序,其中源码Collections.class,如下

    public static <T extends Comparable<? super T>> void sort(List<T> paramList) { paramList.sort(null); }

    此外,"实现了Comparable接口的类的对象"可以用作"有序映射(如TreeMap)"中的键或"有序集合(TreeSet)"中的元素,而不需要指定比较器。

    代码案列:

    package com.itheima.course.collection;
    
    /**
     * @description 实现了Comparable接口的类
     * @author ...
     * @date 2021-02-07 16:58:25
     */
    public class SortA implements Comparable<SortA> {
        private String name;
        private Integer order;
    
        /**
         * @return the name
         */
        public String getName() {
            return name;
        }
    
        /**
         * @param name the name to set
         */
        public void setName(String name) {
            this.name = name;
        }
    
        /**
         * @return the order
         */
        public Integer getOrder() {
            return order;
        }
    
        /**
         * @param order the order to set
         */
        public void setOrder(Integer order) {
            this.order = order;
        }
    
        @Override
        public String toString() {
            return "SortA [name=" + name + ", order=" + order + "]";
        }
    
        @Override
        public int compareTo(SortA sortA) {
            // 升序
            return this.order.compareTo(sortA.getOrder());
            // return this.order - sortA.getOrder();
            // 倒序
            // return sortA.getOrder().compareTo(this.order);
            // return sortA.getOrder() - this.order;
        }
    }
    /**
     * 
     */
    package com.itheima.course.collection;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    /**
     * @description 测试类
     * @author ...
     * @date 2021-02-07 17:11:07
     */
    public class SortATest {
        public static void main(String[] args) {
            // String 排序
            List<String> lists = new ArrayList<String>();
            lists.add("5");
            lists.add("2");
            lists.add("9");
            // lists中的对象String 本身含有compareTo方法,所以可以直接调用sort方法,按自然顺序排序,即升序排序
            Collections.sort(lists);
            System.out.println("String 排序后: " + lists.toString());
            // 结果 String 排序后: [2, 5, 9]
    
            // 第一种方法示例:
            List<SortA> listA = new ArrayList<SortA>();
            SortA a1 = new SortA();
            a1.setName("a");
            a1.setOrder(2);
            SortA a2 = new SortA();
            a2.setName("b");
            a2.setOrder(1);
            SortA a3 = new SortA();
            a3.setName("c");
            a3.setOrder(5);
            listA.add(a1);
            listA.add(a2);
            listA.add(a3);
            // list中的对象A实现Comparable接口
            Collections.sort(listA);
            System.out.println("排序后: " + listA);
            // 结果排序后: [SortA [name=b, order=1], SortA [name=a, order=2], SortA [name=c,
            // order=5]]
        }
    
    }

    2. 若需要排序的元素未实现Comparable接口,则我们可使用Comparator 比较器接口。

        我们若需要控制某个类的次序,而该类本身不支持排序(即没有实现Comparable接口);那么,我们可以建立一个“比较器”来进行排序。这个“比较器”只需要实现Comparator接口即可。也就是说,我们可以通过“实现Comparator类来新建一个比较器”,然后通过该比较器对类进行排序。

    • Collections.sort(list, new PriceComparator())

      • 参数一:需要排序的list
      • 参数二:比较器,实现Comparator接口的类,返回一个int型的值,就相当于一个标志,告诉sort方法按什么顺序来对list进行排序。
    • Comparator是个接口,可重写compare()及equals()这两个方法,用于比较功能;如果是null的话,就是使用元素的默认顺序,如a,b,c,d,e,f,g,就是a,b,c,d,e,f,g这样,当然数字也是这样的。

      • compare(a,b)方法:根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。
      • equals(obj)方法:仅当指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时才返回 true。
    package com.itheima.course.collection;
    
    /**
     * @description 实体类
     * @author ...
     * @date 2021-02-07 17:16:12
     */
    public class SortB {
        private String name;
        private Integer order;
    
        /**
         * @return the name
         */
        public String getName() {
            return name;
        }
    
        /**
         * @param name the name to set
         */
        public void setName(String name) {
            this.name = name;
        }
    
        /**
         * @return the order
         */
        public Integer getOrder() {
            return order;
        }
    
        /**
         * @param order the order to set
         */
        public void setOrder(Integer order) {
            this.order = order;
        }
    
        @Override
        public String toString() {
            return "SortB [name=" + name + ", order=" + order + "]";
        }
    
    }
    /**
     * 
     */
    package com.itheima.course.collection;
    
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.List;
    
    /**
     * @description SortB测试类
     * @author ...
     * @date 2021-02-07 17:18:09
     */
    public class SortBTest {
        public static void main(String[] args) {
            // 示例:
            List<SortA> listA = new ArrayList<SortA>();
            SortA a1 = new SortA();
            a1.setName("a");
            a1.setOrder(2);
            SortA a2 = new SortA();
            a2.setName("b");
            a2.setOrder(1);
            SortA a3 = new SortA();
            a3.setName("c");
            a3.setOrder(5);
            listA.add(a1);
            listA.add(a2);
            listA.add(a3);
            Collections.sort(listA, new Comparator<SortA>() {
                public int compare(SortA s1, SortA s2) {
                    /**
                     * 升序排的话就是第一个参数.compareTo(第二个参数); 降序排的话就是第二个参数.compareTo(第一个参数);
                     */
                    return s2.getOrder().compareTo(s1.getOrder());
                }
            });
            System.out.println("降序排序后: " + listA.toString());
            // 结果
            // 降序排序后: [SortA [name=c, order=5], SortA [name=a, order=2], SortA [name=b, order=1]]
        }
    }

    二、Collections.sort()和Arrays.sort()排序案列

    package com.itheima.course.collection;
    
    import java.nio.charset.Charset;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.Comparator;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.Map.Entry;
    import java.util.Set;
    import java.util.TreeSet;
    
    /**
     * @description 测试主类
     * @author ...
     * @date 2021-02-03 08:43:19
     */
    public class TestMain {
    
        /**
         * 按ASCII码升序排序 Arrays.sort
         * 
         * @param data 待排序数据
         * @return 排序后数据
         */
        public static String arraysSort(final Map<String, String> data) {
            Set<String> keySet = data.keySet();
            String[] keyArray = keySet.toArray(new String[keySet.size()]);
            Arrays.sort(keyArray);
            // 构造URL 键值对的格式
            StringBuilder sb = new StringBuilder();
            for (String k : keyArray) {
                // 参数值为空,则不参与签名
                if (data.get(k).trim().length() > 0) {
                    sb.append(k).append("=").append(data.get(k).trim()).append("&");
                }
            }
            if (sb.length() > 0) {
                sb.deleteCharAt(sb.length() - 1);
            }
            return sb.toString();
        }
    
        /**
         * 按ASCII码降序排序 Collections.sort
         * 
         * @param data 待排序数据
         * @return 排序后数据
         */
        public static String collectionssSort1(final Map<String, String> data) {
            Set<String> keySet = data.keySet();
            String[] keyArray = keySet.toArray(new String[keySet.size()]);
            List<String> keyList = Arrays.asList(keyArray);
            Collections.sort(keyList, new Comparator<String>() {
                @Override
                public int compare(String paramT1, String paramT2) {
                    return paramT2.compareTo(paramT1);
                }
            });
            // 构造URL 键值对的格式
            StringBuilder sb = new StringBuilder();
            for (String k : keyArray) {
                // 参数值为空,则不参与签名
                if (data.get(k).trim().length() > 0) {
                    sb.append(k).append("=").append(data.get(k).trim()).append("&");
                }
            }
            if (sb.length() > 0) {
                sb.deleteCharAt(sb.length() - 1);
            }
            return sb.toString();
        }
    
        /**
         * 按ASCII码降序排序 Collections.sort
         * 
         * @param data 待排序数据
         * @return 排序后数据
         */
        public static String collectionssSort2(final Map<String, String> data) {
            List<Map.Entry<String, String>> list = new ArrayList<Map.Entry<String, String>>(data.entrySet());
            Collections.sort(list, new Comparator<Map.Entry<String, String>>() {
                @Override
                public int compare(Entry<String, String> paramT1, Entry<String, String> paramT2) {
                    return (paramT1.getKey()).toString().compareTo(paramT2.getKey());
                }
            });
            // 构造URL 键值对的格式
            StringBuilder sb = new StringBuilder();
            for (Map.Entry<String, String> item : list) {
                String key = item.getKey();
                String value = item.getValue();
                // 参数值为空,则不参与签名
                if (value != null && (!"".equals(value.trim()))) {
                    sb.append(key).append("=").append(value.trim()).append("&");
                }
            }
            if (sb.length() > 0) {
                sb.deleteCharAt(sb.length() - 1);
            }
            return sb.toString();
        }
    
        public static void main(String[] args) {
            Map<String, String> sortMap = new HashMap<String, String>();
            sortMap.put("zx", "123");
            sortMap.put("zz", "456");
            sortMap.put("aa", "789");
            // 按ASCII码升序排序
            System.out.println(arraysSort(sortMap));
            System.out.println("按ASCII码降序排序 Collections.sort: " + collectionssSort1(sortMap));
            System.out.println("按ASCII码降序排序 Collections.sort: " + collectionssSort2(sortMap));
            /*
             * 结果: 
             * aa=789&zx=123&zz=456
             * zz=456&zx=123&aa=789
             * aa=789&zx=123&zz=456
             */

    // 目的: 比较器Comparator的 @SuppressWarnings(value = { "unused" }) Comparator<Integer> comp = new Comparator<Integer>() { @Override public int compare(Integer paramT1, Integer paramT2) { return paramT1 - paramT2; } }; Set<Integer> set = new TreeSet<Integer>(comp); set.add(33); set.add(10); set.add(55); System.out.println(set); } }
  • 相关阅读:
    腾讯//全排列
    腾讯//全排列
    腾讯//子集
    腾讯//子集
    腾讯///括号生成
    腾讯///括号生成
    腾讯//二叉树的最近公共祖先
    腾讯//二叉树的最近公共祖先
    腾讯//二叉搜索树的最近公共祖先
    腾讯//二叉搜索树的最近公共祖先
  • 原文地址:https://www.cnblogs.com/damoblog/p/14384688.html
Copyright © 2011-2022 走看看