Java List/HashSet/HashMap的排序
在对Java无序类集合,如List(ArrayList/LinkedList)、HashSet(TreeSet有序)、HashMap等排序时,Java中一个公共的类Collections,提供了对Java集合排序等很好的方法sort。 但是有一个要求是sort方法的参数为<List list> 或<List list, Comparator<? super T> c>,即排序对象要求必须是List类型。
sort 方法的参数必须为List 的原因是,只有List可以定义排序的方法,让List中的元素改变在构建List时原始的相对位置(初始构建时,元素相对位置即为元素初始加入顺序)。HashSet、HashMap 在构建时,初始加入的元素已经按照元素的hashCode()方法的定义排好序。所以这里所说的HashSet 排序 和 HashMap 排序是指:将其中的元素导出到另一个集合中,对该载体集合排序。排序之后,原HashSet 和 HashMap 中元素顺序没有变。
故而对Java无序类集合的排序问题,基本思路就是:将HashSet 或 HashMap 中的元素取出放入 List 中,对List 用 Collections.sort() 方法排序,之后输出排序后List中的元素,即为对Set/Map 中元素排序后的结果。注意HashSet、HashMap 中元素位置没有改变,依然只和 初始构建时,元素本身自定义的hashCode() 方法有关。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Map; public class Test {
public static void main(String[] args){
ArrayList<String> listTest = new ArrayList<String>();
listTest.add("bbc");
listTest.add("abc");
listTest.add("acb"); HashSet<String> setTest = new HashSet<String>();
setTest.add("bbc");
setTest.add("abc");
setTest.add("acb");
System.out.println("HashSet BeforeSort:");
for(String s : setTest)
System.out.println(s); HashMap<String, Integer> mapTest = new HashMap<String, Integer>();
mapTest.put("bbc", 1);
mapTest.put("abc", 2);
mapTest.put("acb", 3);
System.out.println("HashMap BeforeSort:");
for(Map.Entry<String, Integer> entry : mapTest.entrySet())
System.out.println(entry.getKey() + " " + entry.getValue()); /*
* List
*/
Collections.sort(listTest);
Iterator<String> list_iter = listTest.iterator();
while(list_iter.hasNext())
System.out.println(list_iter.next()); /*
* Set
*/
LinkedList<String> setSort = new LinkedList<String>(setTest);
//Collections.sort(setSort);
Comparator<String> setComp = Collections.reverseOrder();
Collections.sort(setSort, setComp);
/*LinkedList<String> setSort = new LinkedList<String>();
for(String s : setTest)
setSort.add(s);*/
for(String s : setTest)
System.out.println(s);
for(String s : setSort)
System.out.println(s); /*
* Map
*/
LinkedList<String> mapSort = new LinkedList<String>();
mapSort.addAll(mapTest.keySet());
//Collections.sort(mapSort);
Comparator<String> mapComp = Collections.reverseOrder();
Collections.sort(mapSort, mapComp);
for(Map.Entry<String, Integer> entry : mapTest.entrySet())
System.out.println(entry.getKey() + " " + entry.getValue());
for(final Iterator<String> map_iter= mapSort.iterator(); map_iter.hasNext();)
System.out.println(map_iter.next());
/*
LinkedList<Map.Entry<String, Integer>> mapEntry = new LinkedList<Map.Entry<String,Integer>>();
mapEntry.addAll(mapTest.entrySet());
Collections.sort(mapEntry, new Comparator<Map.Entry<String, Integer>>() {
public int compare(Map.Entry<String, Integer> a, Map.Entry<String, Integer> b){
if(a.getValue() > b.getValue())
return -1;
else
return 1;
}
}); for(Map.Entry<String, Integer> entry : mapEntry)
System.out.println(entry.getKey() + " " +entry.getValue());
for(Map.Entry<String, Integer> entry : mapTest.entrySet())
System.out.println(entry.getKey() + " " + entry.getValue());*/
}
}
HashSet BeforeSort:
abc
acb
bbc
HashMap BeforeSort:
abc 2
acb 3
bbc 1
//List AfterSort
abc
acb
bbc
//HashSet AfterSort
abc
acb
bbc
//setSort AfterSort (setSort is means HashSet to LinkedList)
bbc
acb
abc
//HashMap AfterSort
abc 2
acb 3
bbc 1
//mapSort AfterSort (mapSort is means HashMap to LinkedList)
bbc
acb
abc
一、按key值排序
假设HashMap存储的键-值对为(String,Integer),按key排序可以调用JDK函数sort(默认的按字典升序):
Set<String> keySet = map.keySet();
Collections.sort(keySet);
for(Iterator<String> ite = keySet.iterator(); ite.hasNext();) {
String temp = ite.next();
System.out.println("key-value: "+temp+","+map.getValue(temp);
}
如果想要按字典的降序排列,则需改写sort方法里面的比较器Comparator:
Collections.sort(keySet, new Comparator() {
public int compare(Object o1, Object o2) {
if(Integer.parseInt(o1.toString())>Integer.parseInt(o2.toString())
return 1;
if(Integer.parseInt(o1.toString())==Integer.parseInt(o2.toString())
return 0;
else
return -1;
}
}); 二、按value值排序
1)方法一:用两个list链表实现
List<String> keyList = new LinkedList<String>();
keyList.addAll(map.keySet());
List<Integer> valueList = new LinkedList<Integer>();
valueList.addAll(map.values());
for(int i=0; i<valueList.size(); i++)
for(int j=i+1; j<valueList.size(); j++) {
if(valueList.get(j)>valueList.get(i)) {
valueList.set(j, valueList.get(i));
valueList.set(i, valueList.get(j));
//同样调整对应的key值
keyList.set(j, keyList.get(i));
keyList.set(i, kyeList.get(j));
}
然后依次把key值和对应value值重新装入HashMap即可。
2)方法二:改写JDK提供的Comparator接口方法compare
List<Map.Entry<String, Integer>> list = new LinkedList<Map.Entry<String, Integer>>();
list.addAll(map.entrySet());
Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() {
public int compare(Map.Entry obj1, Map.Entry obj2) {//从高往低排序 if(Integer.parseInt(obj1.getValue().toString())<Integer.parseInt(obj2.getValue().toString()))
return 1;
if(Integer.parseInt(obj1.getValue().toString())==Integer.parseInt(obj2.getValue().toString()))
return 0;
else
return -1;
}
});
for(Iterator<Map.Entry<String, Integer>> ite = list.iterator(); ite.hasNext();) {
Map.Entry<String, Integer> map = ite.next();
System.out.println("key-value: " + map.getKey() + "," + map.getValue());
}
Java List/HashSet/HashMap的排序的更多相关文章
- java 中对hashmap进行排序
public class HashMapSort { public static void main(String[] args) { HashMap<Integer, Student> ...
- C++中的set和java的hashset有何区别?
以前对C++的STL容器烂熟于心,两年没碰过C++了,现在已经很生疏了.工作原因转战java,对java的容器不甚了解,特别是每看到一种容器,不由自主地拿起和C++对比.C++中的set和java的h ...
- Java集合 -- HashSet 和 HashMap
HashSet 集合 HashMap 集合 HashSet集合 1.1 Set 接口的特点 Set体系的集合: A:存入集合的顺序和取出集合的顺序不一致 B:没有索引 C:存入集合的元素没有重复 1. ...
- java 中遍历hashmap 和hashset 的方法
一.java中遍历hashmap: for (Map.Entry<String, Integer> entry : tempMap.entrySet()) { String ...
- java该HashTable,HashMap和HashSet
同一时候我们也对HashSet和HashMap的核心方法hashcode进行了具体解释,见<探索equals()和hashCode()方法>. 万事俱备,那么以下我们就对基于hash算法的 ...
- 【java基础】java集合之HashTable,HashSet,HashMap
[一]HashSet (1)HashSet内部维护的是一个HashMap,具体原理见java集合之HashMap [二]HashTable (1)HashTable内部维护的是一个Entry的数组.E ...
- Java中HashSet和HashMap
Set中存储元素为什么不重复(即使hashCode相同)? HashSet中存放自定义类型元素时候,需要重写对象中的hashCode方法和equals方法, HashSet中存放自定义类型元素时候,需 ...
- HashTable, HashSet, HashMap的区别
HashTable, HashSet, HashMap的区别 hash是一种很常见也很重要的数据结构,是用hash函数根据键值(key)计算出存储地址,以便直接访问.由完美hash函数(即键值 ...
- JAVA Collections工具类sort()排序方法
主要分析内容: 一.Collections工具类两种sort()方法 二.示例 一.Collections工具类两种sort()方法 格式一: public static <T extends ...
随机推荐
- red hat官方的rhel操作系统版本号与内核版本号的对应关系
原文在如下网址:https://access.redhat.com/articles/3078 The tables below list the major and minor Red Hat En ...
- 牛逼的lsof命令!!!
linux lsof命令详解 简介 lsof(list open files)是一个列出当前系统打开文件的工具.在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访 ...
- html_常用技巧总结
============= 博客大全: 脚本之家:http://www.jb51.net/list/list_233_104.htm 红黑联盟: http://www.2cto.com/kf/yid ...
- 一篇文章让你入门Shell !
Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合. Shell可以直接使用在win/Unix/Linux上面 ...
- 处理存在UNASSIGNED的主分片导致Elasticsearch集群状态为Red的问题
我们默认是开启了自动分配的,但仍然会因为服务器软硬件的原因导致分配分配失败,从而出现UNASSIGNED的分片,如果存在该状态的主分片则会导致集群为Red状态.此时我们可以通过reroute API进 ...
- [Python] numpy.random.rand
numpy.random.rand numpy.random.rand(d0, d1, ..., dn) Random values in a given shape. Create an array ...
- CYQ.Data 轻量数据层之路 使用篇二曲 MAction 数据查询(十三)----002
原文链接:https://blog.csdn.net/cyq1162/article/details/53303390 前言说明: 本篇继续上一篇内容,本节介绍所有相关查询的使用. 主要内容提要: 1 ...
- uva-784-水题-搜索
题意:从*点开始,标记所有能走到的点,X代表墙,下划线原样输出 AC:40ms #include<stdio.h> #include<iostream> #include< ...
- python入门-类(二)
1 关于类的导入 可以把类封装到1个文件中 1个文件中也可以封装多个类 在导入的时候可以导入单个,也可以导入多个类,也可以全部导入类 car.py """一个可以用于表示 ...
- 第一个python抓取单网页的例子
#!/usr/bin/env python # coding=utf-8 import requests from bs4 import BeautifulSoup import pymysql im ...