zoukankan      html  css  js  c++  java
  • 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;                                        
    }
  • 相关阅读:
    Spinner使用
    5.5 easypoi模板导出excel测试Demo > 我的程序猿之路:第四十五章
    5.4 SpringCloud配置中心搭建以及问题解决 > 我的程序猿之路:第四十四章
    5.3 Spring事物管理详解 > 我的程序猿之路:第四十二章
    5.2 SpringBoot实现断点续传功能 > 我的程序猿之路:第四十二章
    5.1 java实现doc文档转pdf文件 > 我的程序猿之路:第四一章
    5.0 SpringBoot普通上传功能 > 我的程序猿之路:第四十章
    4.8 数字金额大写转换 插件 > 我的程序猿之路:第三十八章
    4.7 基于Spring注解的定时任务(@Schedule) > 我的程序猿之路:第三十七章
    4.6 基于Spring-Boot的Mysql+jpa的增删改查学习记录 > 我的程序猿之路:第三十六章
  • 原文地址:https://www.cnblogs.com/tjc1996/p/7502103.html
Copyright © 2011-2022 走看看