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