- 浏览: 39152 次
- 性别:
- 来自: 唐山
文章分类
最新评论
可能会遇到这样的情况,我可能要对Map<key,value>的集合进行排序,而这种排序又分为两种情况,你可能按key值排序;另外你也可能会遇到按value值进行排序的情况。
大家都知道,默认的情况下,TreeMap:是按key升序,进行排序的;LinkedHashMap:是按加入顺序进行排序的;HashMap:内部数值的顺序并不是以存放的先后顺序为主,而是以hash值的顺序为主,其次才是存放的先后顺序。在这里我们只讨论如何实现HashMap的排序。
1.我们先讨论按key值进行排序
我们先看一下这个Sorter类:
public class Sorter {
public static Map sort(Map map) {
Map<Object, Object> mapVK = new TreeMap<Object, Object>(
new Comparator<Object>() {
public int compare(Object obj1, Object obj2) {
String v1 = (String)obj1;
String v2 = (String)obj2;
int s = v2.compareTo(v1);
return s;
}
}
);
Set col = map.keySet();
Iterator iter = col.iterator();
while (iter.hasNext()) {
String key = (String) iter.next();
Integer value = (Integer) map.get(key);
mapVK.put(key, value);
}
return mapVK;
}
}
最后给出一个例子:
public class SortHashMap {
public SortHashMap() {
}
public static void main(String[] args) {
Map<String, Integer> maps = new HashMap<String, Integer>();
maps.put("boy",;
maps.put("cat", 7);
maps.put("dog", 1);
maps.put("apple", 5);
//排序前的输出
Set set = maps.entrySet();
Iterator i = set.iterator();
while(i.hasNext()){
Map.Entry<String, Integer> entry1=(Map.Entry<String, Integer>)i.next();
System.out.println(entry1.getKey() + "-------->" + entry1.getValue());
}
System.out.println("----------------");
//排序后的输出
Map<String, Integer> sortMaps = Sorter.sort(maps);
Set sortSet = sortMaps.entrySet();
Iterator ii = sortSet.iterator();
while(ii.hasNext()){
Map.Entry<String, Integer> entry1=(Map.Entry<String, Integer>)ii.next();
System.out.println(entry1.getKey() + "-------->" + entry1.getValue());
}
}
}
排序前的输出结果是:
cat-------->7
apple-------->5
dog-------->1
boy-------->8
排序后的输出结果是:
dog-------->1
cat-------->7
boy-------->8
apple-------->5
经过排序后的Map有序了,是按照字母的逆序排列的。
2、我们再讨论如何按value值进行排序。
还是上面的那个例子,我们想要按照各类对象的数量打印出类别的名称。
我们再来修改一下这个SortHashMap类:
public class SortHashMap {
public SortHashMap() {
}
public static void main(String[] args) {
Map<String, Integer> maps = new HashMap<String, Integer>();
maps.put("boy",;
maps.put("cat", 7);
maps.put("dog", 1);
maps.put("apple", 5);
//排序前的输出
Set set = maps.entrySet();
Iterator i = set.iterator();
while(i.hasNext()){
Map.Entry<String, Integer> entry1=(Map.Entry<String, Integer>)i.next();
System.out.println(entry1.getKey() + "-------->" + entry1.getValue());
}
System.out.println("----------------");
//排序后的输出
List<Map.Entry<String, Integer>> info = new ArrayList<Map.Entry<String, Integer>>(maps.entrySet());
Collections.sort(info, new Comparator<Map.Entry<String, Integer>>() {
public int compare(Map.Entry<String, Integer> obj1, Map.Entry<String, Integer> obj2) {
return obj2.getValue() - obj1.getValue();
}
});
for (int j = 0; j<info.size();j++) {
System.out.println(info.get(j).getKey() + "------->" + info.get(j).getValue());
}
}
}
排序前的输出结果是:
cat-------->7
apple-------->5
dog-------->1
boy-------->8
排序后的输出结果是:
boy------->8
cat------->7
apple------->5
dog------->1
程序运行的结果,达到了我们的要求,实现了Map的排序。该方法主要是利用了ArrayList的排序实现了Map的排序输出,并没有影响到Map的存放结构。
大家都知道,默认的情况下,TreeMap:是按key升序,进行排序的;LinkedHashMap:是按加入顺序进行排序的;HashMap:内部数值的顺序并不是以存放的先后顺序为主,而是以hash值的顺序为主,其次才是存放的先后顺序。在这里我们只讨论如何实现HashMap的排序。
1.我们先讨论按key值进行排序
我们先看一下这个Sorter类:
public class Sorter {
public static Map sort(Map map) {
Map<Object, Object> mapVK = new TreeMap<Object, Object>(
new Comparator<Object>() {
public int compare(Object obj1, Object obj2) {
String v1 = (String)obj1;
String v2 = (String)obj2;
int s = v2.compareTo(v1);
return s;
}
}
);
Set col = map.keySet();
Iterator iter = col.iterator();
while (iter.hasNext()) {
String key = (String) iter.next();
Integer value = (Integer) map.get(key);
mapVK.put(key, value);
}
return mapVK;
}
}
最后给出一个例子:
public class SortHashMap {
public SortHashMap() {
}
public static void main(String[] args) {
Map<String, Integer> maps = new HashMap<String, Integer>();
maps.put("boy",;
maps.put("cat", 7);
maps.put("dog", 1);
maps.put("apple", 5);
//排序前的输出
Set set = maps.entrySet();
Iterator i = set.iterator();
while(i.hasNext()){
Map.Entry<String, Integer> entry1=(Map.Entry<String, Integer>)i.next();
System.out.println(entry1.getKey() + "-------->" + entry1.getValue());
}
System.out.println("----------------");
//排序后的输出
Map<String, Integer> sortMaps = Sorter.sort(maps);
Set sortSet = sortMaps.entrySet();
Iterator ii = sortSet.iterator();
while(ii.hasNext()){
Map.Entry<String, Integer> entry1=(Map.Entry<String, Integer>)ii.next();
System.out.println(entry1.getKey() + "-------->" + entry1.getValue());
}
}
}
排序前的输出结果是:
cat-------->7
apple-------->5
dog-------->1
boy-------->8
排序后的输出结果是:
dog-------->1
cat-------->7
boy-------->8
apple-------->5
经过排序后的Map有序了,是按照字母的逆序排列的。
2、我们再讨论如何按value值进行排序。
还是上面的那个例子,我们想要按照各类对象的数量打印出类别的名称。
我们再来修改一下这个SortHashMap类:
public class SortHashMap {
public SortHashMap() {
}
public static void main(String[] args) {
Map<String, Integer> maps = new HashMap<String, Integer>();
maps.put("boy",;
maps.put("cat", 7);
maps.put("dog", 1);
maps.put("apple", 5);
//排序前的输出
Set set = maps.entrySet();
Iterator i = set.iterator();
while(i.hasNext()){
Map.Entry<String, Integer> entry1=(Map.Entry<String, Integer>)i.next();
System.out.println(entry1.getKey() + "-------->" + entry1.getValue());
}
System.out.println("----------------");
//排序后的输出
List<Map.Entry<String, Integer>> info = new ArrayList<Map.Entry<String, Integer>>(maps.entrySet());
Collections.sort(info, new Comparator<Map.Entry<String, Integer>>() {
public int compare(Map.Entry<String, Integer> obj1, Map.Entry<String, Integer> obj2) {
return obj2.getValue() - obj1.getValue();
}
});
for (int j = 0; j<info.size();j++) {
System.out.println(info.get(j).getKey() + "------->" + info.get(j).getValue());
}
}
}
排序前的输出结果是:
cat-------->7
apple-------->5
dog-------->1
boy-------->8
排序后的输出结果是:
boy------->8
cat------->7
apple------->5
dog------->1
程序运行的结果,达到了我们的要求,实现了Map的排序。该方法主要是利用了ArrayList的排序实现了Map的排序输出,并没有影响到Map的存放结构。
发表评论
-
Tomcat热部署原理
2012-05-19 20:49 1198一. ... -
java 并发实践
2012-03-23 11:02 0java并发编程实践笔记 1, 保证线程安全的三种方法: ... -
Java 解析 xml
2010-07-20 10:59 6941.介绍 1)DOM(JAXP Crimson解析器 ... -
java 编码
2010-07-01 22:06 659现代计算机采用的都是 ... -
Class文件格式解析
2010-07-01 21:40 889http://www.blogjava.net/javafan ... -
java中byte转换int时为何与0xff进行与运算
2010-07-01 21:29 909[转]java中byte转换int时为何与0xff进行与运算 ... -
java 的InputStream和OutputStream的理解
2010-06-21 15:10 1914(转)java 的InputStream和OutputStre ... -
Think in java
2010-04-19 13:26 1009一、第一章 对象导论 1、Alan Kay总结了面向对象的五 ... -
java-email(转)
2010-03-23 15:50 927最近在项目中用到发送 ... -
UNICODE与 UTF-8的转换详解
2010-03-19 10:18 4803转载请注明出处: http://www.ins1000.cn/ ... -
java中hashcode()和 equals()的详解[转]
2010-03-18 14:34 715java中hashcode()和 equals() ... -
细说java的util中的集合类
2010-03-03 14:54 729线性表,链表,哈希表是常用的数据结构,在进行Java开发时,J ... -
String 创建
2010-03-01 10:52 776package com; import org.junit.T ... -
java字符串连接
2010-02-01 17:22 1542注:引用http://www.blogjava.net/nok ... -
java
2010-01-06 16:53 644【转】JNDI的详细介绍(09-03-27) 收藏 看到这篇关 ...
相关推荐
本篇文章将详细探讨STL中的四个常用组件:`vector`、`map`、`set`以及排序算法`sort`的用法。 1. `vector`: `vector`是STL中最基本的动态数组,它允许在运行时动态增加或减少元素。`vector`提供了许多便利的方法...
mapsort· 对复杂输入进行性能排序。 前言 除非遇到性能问题,否则不需要此库。 mapsort不会添加普通JavaScript中不存在的任何功能。 相反,在以下情况下,它可以极大地提高您的性能: 排序是您的瓶颈,并且 数组...
在Java编程中,Map接口表示一组键值对的集合,其中每个键都是唯一的。然而,标准的Map实现如HashMap、TreeMap等,并不支持按值排序。如果你需要一个按值排序的Map,需要采取一些额外的策略。这里我们将探讨如何在...
根据给定文件的信息,我们可以总结出以下几个...以上就是关于 `vector` 和 `map` 的详细介绍,它们都是 C++ STL 中非常重要的数据结构,对于初学者来说,熟练掌握这些基础知识对于进一步学习 C++ 有着至关重要的作用。
此外,通过优化MapSort过程,百度还实现了IO密集型作业的加速以及简单统计类应用的map过程加速。 在资源调度方面,百度提出了使用idle平台进行统一资源调度的理念,这有助于更高效地利用和分配集群的计算资源。 ...
我们可以将Map转换为List<Map.Entry, V>>,然后使用Collections.sort()方法对List进行排序。这里需要提供一个Comparator,基于值进行比较: ```java Map, Integer> map = new HashMap(); // 添加元素... List<Map....
以下代码展示了如何使用 Collections 的 sort 方法实现 Map 按 value 排序: ```java List<Map.Entry, String>> list = new ArrayList(map.entrySet()); Collections.sort(list, new Comparator<Map.Entry, String>...
public Map, String> sortMapByValue(Map, String> oriMap) { Map, String> sortedMap = new LinkedHashMap, String>(); if (oriMap != null && !oriMap.isEmpty()) { List<Map.Entry, String>> entryList = new ...
Java中实现Map排序的方式主要有两种,一种是使用TreeMap,另一种是使用SortedMap接口。HashMap内部元素是无序的,它不会记录插入顺序,也不保证顺序。如果需要有序的Map,可以使用TreeMap,它会根据键的自然顺序进行...
MapReduce模型主要由两个主要阶段组成:Map阶段和Reduce阶段,以及一个可选的Shuffle和Sort阶段。Map阶段将输入数据拆分成键值对,并对其进行局部处理;Reduce阶段则对Map阶段的结果进行全局聚合,以生成最终的输出...
Collections.sort(entryList, new Comparator<Map.Entry, String>>() { @Override public int compare(Map.Entry, String> o1, Map.Entry, String> o2) { return o1.getKey().compareTo(o2.getKey()); } }); ```...
### C++ STL 中 Vector, Map, Set 和 Sort 的用法详解 #### 一、Vector (向量) **1. 声明** - `vector<int> a;` —— 声明一个元素类型为 `int` 的 `vector` 对象 `a`,初始时不含任何元素。 - `vector<MyType> a...
实现Map的排序功能,此文档针对Java开发,。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。...
本资源包含对STL中多种关键容器的详细讲解,包括Vector、Deque、sort、set、map等,这些都是C++程序员在实际开发中不可或缺的工具。 1. **Vector**:Vector是一个动态数组,它允许在任何位置插入和删除元素。其底层...
在Map程序框架中,通常会有额外的组件,例如Shuffle和Sort。Shuffle阶段负责重新组织Map阶段产生的中间键值对,确保相同的键被分到同一个Reducer中。Sort则是在Shuffle之后,对每个Reducer的输入进行排序,这通常是...
Collections.sort(list, new Comparator<Map.Entry, V>>() { @Override public int compare(Map.Entry, V> o1, Map.Entry, V> o2) { int compare = (o1.getValue()).compareTo(o2.getValue()); return -compare...
- `sort()`和`reverse()`函数可以对`list`进行排序和反转。 - `push_front()`和`pop_front()`分别用于在列表开头添加和移除元素。 3. **map**: - `map`是一种关联容器,其中的元素以键值对形式存储。每个键值对...
(11)函数:参数、返回值、lambda、reduce、sort、map、filter
本篇将详细讲解如何使用`ListView`显示按时间排序的数据,并通过`Adapter`和`Collections.sort`方法处理Map中的数据。 首先,我们要理解`ListView`的工作原理。`ListView`是一个可以滚动的视图,它通过复用已创建的...