Java的集合排序

前言:这几天碰到了一道算法题和一道面试题,问集合框架怎么排序的,有点懵逼。


1.比较器接口:

Comparator<T>  

    接口  T - 此Comparator可以比较的对象类型

      定义:强行对某个对象 collection 进行整体排序 的比较函数。可以将 Comparator 传递给 sort 方法(如 Collections.sort 或 Arrays.sort),从而允许在排序顺序上实现精确控制。还可以使用 Comparator 来控制某些数据结构(如有序 set有序映射)的顺序,或者为那些没有自然顺序的对象 Collection 提供排序。

当且仅当对于一组元素 S 中的每个 e1 和 e2 而言,c.compare(e1, e2)==0 与 e1.equals(e2) 具有相等的布尔值时,Comparator c 强行对 S 进行的排序才叫做与 equals 一致 的排序。

    

 

通过上面我们可以知道,这个接口说白了就是给集合的元素进行排序。爽歪歪。不用自己写循环循环了。但是我们还是要了解一下它是怎么实现的!!

 

2.Map 集合类

TreeMap

  HashMap实现的接口是Map。大家都知道  Map 集合是一个键值对的集合接口。如果不懂可以点击 Map 。

  

import java.util.Comparator;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

public class TreeMapTest {
    public static void main(String[] args) {
        //利用TreeMap的构造器,进行Comparator构造
        Map<String, String> map = new TreeMap<String, String>(
                    new Comparator<String>() {
                        public int compare(String o1, String o2) {  //返回两个Map元素对象的键,利用键进行排序
                            return o1.compareTo(o2);   //这样是升序, o2.comparaTo(o1)是降序
                        };
                    });
        //插入元素
        map.put("b", "ccccc");
        map.put("d", "aaaaa");
        map.put("c", "bbbbb");
        map.put("a", "ddddd");
        //利用iterator进行遍历
        Set<String> keySet = map.keySet();
        Iterator<String> it = keySet.iterator();
        while (it.hasNext()) {
            String key = it.next();
            System.out.println(key + ":" + map.get(key));
        }
    }
}

 

 

结果是:

a:ddddd
b:ccccc
c:bbbbb
d:aaaaa

 

 

HashMap

  HashMap是由哈希映射的,是乱序的。在Api文档中,HashMap并不可以像TreeMap那样通过构造器进行排序。但是,我们可以通过Collections.sort()进行我们的排序。需要注意的是,排序之前我们需要

先把Map转成Collection集合,才能用Collections的方法!

import java.util.ArrayList;
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;

public class HashMapTest {

    public static void main(String[] args) {
        //初始化
        Map<String, String> map = new HashMap<String, String>();
        map.put("c", "ccccc");
        map.put("a", "aaaaa");
        map.put("b", "bbbbb");
        map.put("d", "ddddd");
        
        // 利用 Map.Entry接口返回了Collection视图。
        List<Map.Entry<String,String>> list =  new ArrayList<Map.Entry<String, String>>(map.entrySet());
        Collections.sort(list, new Comparator<Map.Entry<String, String>>() {
            @Override
            public int compare(Entry<String, String> o1, Entry<String, String> o2) {
                return o1.getKey().compareTo(o2.getKey());   //根据 键 来进行升序排序。反过来就是降序
            }
        });
        
        
    }
}

 

  

 

拓展: (键值联合排序)

if (o1.getKey().compareTo(o2.getValue()) > 0) {   //根据 键 来排序
    return 1;
}else if(o1.getKey().compareTo(o2.getKey()) == 0){  //如果 键 相等,那么根据 值 来排序
    return o1.getValue().compareTo(o2.getValue());
}else{
    return -1;                                        
}

 

posted on 2017-09-10 20:22  野区杰西  阅读(297)  评论(0编辑  收藏  举报

导航