`
ekisstherain
  • 浏览: 172865 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Java Map按键排序和按值排序(转)

阅读更多

Map排序的方式有很多种,这里记录下自己总结的两种比较常用的方式:按键排序(sort by key), 按值排序(sort by value)。

 

按键排序(sort by key)

jdk内置的java.util包下的TreeMap<K,V>既可满足此类需求,原理很简单,其重载的构造器之一

有一个参数,该参数接受一个比较器,比较器定义比较规则,比较规则就是作用于TreeMap<K,V>的键,据此可实现按键排序。

 

 
public Map<String, String> sortMapByKey(Map<String, String> oriMap) {  
    if (oriMap == null || oriMap.isEmpty()) {  
        return null;  
    }  
    Map<String, String> sortedMap = new TreeMap<String, String>(new Comparator<String>() {  
        public int compare(String key1, String key2) {  
            int intKey1 = 0, intKey2 = 0;  
            try {  
                intKey1 = getInt(key1);  
                intKey2 = getInt(key2);  
            } catch (Exception e) {  
                intKey1 = 0;   
                intKey2 = 0;  
            }  
            return intKey1 - intKey2;  
        }});  
    sortedMap.putAll(oriMap);  
    return sortedMap;  
}  
  
private int getInt(String str) {  
    int i = 0;  
    try {  
        Pattern p = Pattern.compile("^\\d+");  
        Matcher m = p.matcher(str);  
        if (m.find()) {  
            i = Integer.valueOf(m.group());  
        }  
    } catch (NumberFormatException e) {  
        e.printStackTrace();  
    }  
    return i;  
}  
 
 

按值排序(sort by value)

按值排序就相对麻烦些了,貌似没有直接可用的数据结构能处理类似需求,需要我们自己转换一下。

Map本身按值排序是很有意义的,很多场合下都会遇到类似需求,可以认为其值是定义的某种规则或者权重。

 

 
public Map<String, String> sortMapByValue(Map<String, String> oriMap) {  
    Map<String, String> sortedMap = new LinkedHashMap<String, String>();  
    if (oriMap != null && !oriMap.isEmpty()) {  
        List<Map.Entry<String, String>> entryList = new ArrayList<Map.Entry<String, String>>(oriMap.entrySet());  
        Collections.sort(entryList,  
                new Comparator<Map.Entry<String, String>>() {  
                    public int compare(Entry<String, String> entry1,  
                            Entry<String, String> entry2) {  
                        int value1 = 0, value2 = 0;  
                        try {  
                            value1 = getInt(entry1.getValue());  
                            value2 = getInt(entry2.getValue());  
                        } catch (NumberFormatException e) {  
                            value1 = 0;  
                            value2 = 0;  
                        }  
                        return value2 - value1;  
                    }  
                });  
        Iterator<Map.Entry<String, String>> iter = entryList.iterator();  
        Map.Entry<String, String> tmpEntry = null;  
        while (iter.hasNext()) {  
            tmpEntry = iter.next();  
            sortedMap.put(tmpEntry.getKey(), tmpEntry.getValue());  
        }  
    }  
    return sortedMap;  
}  
 

本例中先将待排序oriMap中的所有元素置于一个列表中,接着使用java.util.Collections的一个静态方法

 

来排序列表,同样是用比较器定义比较规则。排序后的列表中的元素再依次被装入Map,需要注意的一点是为了肯定的保证Map中元素与排序后的List中的元素的顺序一致,使用了LinkedHashMap数据类型,虽然该类型不常见,但是在一些特殊场合下还是非常有用的。

 

 

引用

分享到:
评论

相关推荐

    Java Map按键排序和按值排序

    Java Map按键排序和按值排序 Java Map按键排序和按值排序是Java编程语言中常用的数据结构之一。Map是一种键值对的集合,它可以按照键或值进行排序。下面,我们将详细地介绍Java Map的按键排序和按值排序。 按键...

    对于java map类排序

    在给定的代码中,有一个名为`mapSortByKey`的方法,该方法接收一个未排序的`Map, Integer&gt;`作为参数,并返回一个按键排序的`SortedMap, Integer&gt;`。这个方法的关键在于使用了`TreeMap`类,因为`TreeMap`是实现了`...

    java map实例,排序

    关于Map的排序,Java 8引入了一个新的API——`Map.Entry`的`comparingByValue()`和`comparingByKey()`方法,这使得我们可以方便地对Map的值或键进行比较和排序。例如,可以使用`map.entrySet().stream().sorted(Map....

    浅谈Java之Map 按值排序 (Map sort by value)

    这里我们将探讨如何在Java中实现按值排序的Map,特别关注“按值排序”这一需求。 首先,标准的SortedMap接口是根据键(key)进行排序的,例如TreeMap就是一种按键升序排序的实现。因此,如果想按值排序,我们需要...

    如何利用Java8 Stream API对Map按键或值排序

    在本文中,我们将深入探讨如何使用Stream API来按键或值对Map进行排序,以及涉及的一些关键函数和概念。 一、Java 8 Stream API简介 Java 8 Stream API 是一种函数式编程的体现,它允许对集合数据进行一系列操作,...

    java8-如何使用Stream API对Map类型元素排序.pdf

    本文将深入讲解如何使用Stream API对Map进行排序,包括按键排序、按值排序以及使用`merge()`函数处理键值冲突。 首先,让我们了解一下Java 8 Stream的基本概念。Stream API允许我们对集合进行一系列操作,如过滤、...

    Java Map的排序实例详解

    该方法允许用户使用自定义的排序方法,可以按键进行排序,或者按值进行排序。下面是一个简单的示例代码: ```java Map, Integer&gt; map_Data = new HashMap, Integer&gt;(); map_Data.put("A", 98); map_Data.put("B", ...

    Java中Map的排序问题详解

    本文将深入探讨如何在Java中对Map进行按键排序和按值排序。 首先,让我们了解各种Map实现的特点: 1. **HashMap**:HashMap是最常见的Map实现,它依赖于键的hashCode来存储数据,提供快速的访问速度。然而,...

    java集合MAP三种遍历

    - 在需要按照特定顺序(如按键排序)遍历时,可以先对键集合进行排序,再进行遍历。 - 如果需要根据特定的键执行某些操作,则该方法非常适合。 #### 3. 利用`entrySet()`遍历 `entrySet()`方法返回一个包含Map中...

    JCF(List、Set、Map)学习,实现了<key,value>按value排序噢

    在标准的JDK中,Map接口本身并不支持按值排序,因为它的设计目的是按键排序。但是,通过一些技巧,我们可以实现按值排序。 对于`TreeMap`,我们可以通过创建一个内部类作为Comparator,该Comparator比较键值对的值...

    Map排序

    标题中的“Map排序”指的是在Java编程中对Map集合进行排序的操作。Map接口在Java中是一种非常重要的数据结构,它存储键值对(key-value pairs),其中键是唯一的。默认情况下,Map并不保证其元素的顺序,但有些场景下...

    美国的邮政编码 全部 java map

    总结来说,这个程序利用Java的Map数据结构有效地管理和检索美国的邮政编码信息。通过使用HashMap,可以实现快速的查找和插入操作。文件"postcodes_us.txt"提供原始数据,程序需要读取并解析这些数据,将它们转化为...

    Java集合排序及java集合类详解(Collection、List、Map、Set

    本文将深入探讨Java集合框架的四大核心组件:`Collection`、`List`、`Map`和`Set`,以及它们的排序方法。 ### 1. 集合框架概述 #### 1.1.1 容器简介 在Java中,容器(Containers)是用来存储和管理对象的结构。...

    java中三种集合set、map、list的区别与联系

    - **`TreeMap`**:基于红黑树实现,能自动按键排序,支持范围查询。键按自然顺序或自定义比较器排序。 - **`LinkedHashMap`**:保留了`HashMap`的高效性,同时维护了键值对的插入顺序或访问顺序。 ### List `List`...

    HashMap排序

    无论是按键还是按值排序,都需要根据实际需求选择合适的方法。通过使用`Comparator`接口或自定义比较器,我们可以轻松地实现不同类型的排序操作。这对于处理大量数据时保持数据的有序性非常重要。

    java 集合和内部类资料

    对于Map,你可以学习到如何遍历Map以及如何根据键或值进行排序。 `内部类`文件可能详细阐述了内部类的使用场景、优缺点以及如何创建和使用它们。通过学习,你将能够熟练地运用内部类来增强代码的可读性、灵活性和...

    map实现按value升序排序

    总结来说,通过自定义`Comparator`并结合`Arrays.sort()`方法,我们可以对`Map`进行定制化的排序,无论是按值升序排序还是按键排序。但要注意,这种方法只是返回了一个排序后的`Entry`数组,并未改变原`Map`的顺序。...

Global site tag (gtag.js) - Google Analytics