Java中如何通过key和value对HashMap进行排序
在 Java 中对 HashMap
进行排序并不像听起来那么容易,因为不幸的是,Java API 没有提供任何实用方法来根据键和值对 HashMap 进行排序。 对 HashMap 进行排序不像在 Java 中对 ArrayList
或数组进行排序。 如果大家想知道为什么我们不能使用 Collections.sort()
方法而不是为了它只接受 List<E>
的信息,这让我们可以编写自己的实用方法来在 Java 中对 Map 进行排序。 这适用于所有类型的映射,如 Hashtable、HashMap 和 LinkedHashMap。 TreeMap 已经是一个排序好的Map,所以我们不需要再对它进行排序。
Java中为什么要对 HashMap 进行排序,为什么不能用 TreeMap 代替 HashMap 是大多数Java程序员在问到Java中对 HashMap 进行排序时都会出现在脑海中的问题。
好吧,TreeMap 比 HashMap 慢得多,因为它在每次插入、更新和删除时都运行排序操作,有时你并不真的需要一个一直排序的 Map,你需要的是能够根据其对任何 Map 实现进行排序的能力 键和值。
在本篇 Java 文章中,我们将看到几种在 Java 中对 HashMap
进行排序的方法。
在 Java 中排序 Map - 按键
正如我所说,Java 中的 Map 或 HashMap 可以按键或值排序。 按键对 Map 排序比按值排序更容易,因为 Map 允许重复值但不允许重复键。
我们可以通过将键复制到列表而不是使用 Collections.sort()
方法对列表进行排序来对 Map(无论是 HashMap 还是 Hashtable)进行排序,在这里我们可以根据要按自定义顺序还是自然顺序进行排序来使用 Comparator
或 Comparable
。
对键列表进行排序后,我们可以创建另一个 Map,特别是 LinkedHashMap
以按排序顺序插入键。 LinkedHashMap
将维护键插入的顺序,结果是一个基于键排序的 Map。
这在以下示例中通过编写通用参数化方法来根据键对 Map 进行排序来显示。 我们还可以使用 TreeMap 和 Google Collection API (Guava) 在 Java 中对 Map 进行排序。 使用 Guava 的优点是我们可以灵活地指定顺序。
在 Java 中对 Map 进行排序 - 按值
在 Java 中排序 Map,例如 基于值的 HashMap 或 Hashtable 比基于键对 Map 排序更困难,因为 Map 允许重复值,并且我们还面临处理空值的挑战。
package test;
import com.google.common.collect.Maps;
import com.google.common.collect.Ordering;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;
public class MapSortingExample {
public static void main(String args[]) {
//创建用于排序的哈希表
Map<String, Integer> olympic2012 = new HashMap<String, Integer>();
olympic2012.put("England", 3);
olympic2012.put("USA", 1);
olympic2012.put("China", 2);
olympic2012.put("Russia", 4);
//olympic2012.put("Australia", 4); //添加重复值
//不排序打印哈希表
System.out.println("Unsorted Map in Java : " + olympic2012);
//排序Map 例如 HashMap,Java 中的按键哈希表
Map<String, Integer> sorted = sortByKeys(olympic2012);
System.out.println("Sorted Map in Java by key: " + sorted);
//在 Java 中按值对 Hashtable 和 HashMap 等 Map 进行排序
sorted = sortByValues(olympic2012);
System.out.println("Sorted Map in Java by values: " + sorted);
//使用 TreeMap 按键对 Java 中的 Map 进行排序
Map<String, Integer> sortedMapByKeys = new TreeMap<String,Integer>();
sortedMapByKeys.putAll(olympic2012);
System.out.println("Sorted Map in Java by key using TreeMap : " + sortedMapByKeys);
// 使用 Google Collections (Guava) 在 Java 中按键对 Map 进行排序
// 主要好处是我们可以指定任何顺序,如自然或 toString 或任意
Map<String, Integer> sortingUsingGuava = Maps.newTreeMap(Ordering.natural());
sortingUsingGuava.putAll(olympic2012);
System.out.println("Example to sort Map in Java using Guava : " + sortingUsingGuava);
}
/*
* 对 Map 进行排序的参数化方法,例如 如果 Map 包含空键,
* Java 中的 HashMap 或 Hashtable 会抛出 NullPointerException
*/
public static <K extends Comparable,V extends Comparable> Map<K,V> sortByKeys(Map<K,V> map){
List<K> keys = new LinkedList<K>(map.keySet());
Collections.sort(keys);
// LinkedHashMap 将按照插入的顺序保存键
// 该顺序当前按自然顺序排序
Map<K,V> sortedMap = new LinkedHashMap<K,V>();
for(K key: keys){
sortedMap.put(key, map.get(key));
}
return sortedMap;
}
/*
* Java 方法按值对 Java 中的 Map 进行排序,
* 例如 如果 Map 包含空值,HashMap 或 Hashtable 会抛出 NullPointerException 它也会对值进行排序,
* 即使它们是重复的
*/
public static <K extends Comparable,V extends Comparable> Map<K,V> sortByValues(Map<K,V> map){
List<Map.Entry<K,V>> entries = new LinkedList<Map.Entry<K,V>>(map.entrySet());
Collections.sort(entries, new Comparator<Map.Entry<K,V>>() {
@Override
public int compare(Entry<K, V> o1, Entry<K, V> o2) {
return o1.getValue().compareTo(o2.getValue());
}
});
// LinkedHashMap 将按照插入的顺序保存键
// 该顺序当前按自然顺序排序
Map<K,V> sortedMap = new LinkedHashMap<K,V>();
for(Map.Entry<K,V> entry: entries){
sortedMap.put(entry.getKey(), entry.getValue());
}
return sortedMap;
}
}
以上代码输出结果如下
Unsorted Map in Java : {USA=1, England=3, Russia=4, China=2}
Sorted Map in Java by key: {China=2, England=3, Russia=4, USA=1}
Sorted Map in Java by values: {USA=1, China=2, England=3, Russia=4}
Sorted Map in Java by key using TreeMap : {China=2, England=3, Russia=4, USA=1}
Example to sort Map in Java using Guava : {China=2, England=3, Russia=4, USA=1}
这就是如何在 Java 中按键和值对 Map 进行排序的全部内容。 我们已经学习了如何根据键和值对映射实现(如 HashMap、Hashtable)进行排序。 请记住,基于值对 Map 进行排序比基于键对 Map 进行排序更困难,因为 Map 中的值可以为 null 或重复,而键不是这种情况。
相关文章
Do you understand JavaScript closures?
发布时间:2025/02/21 浏览次数:108 分类:JavaScript
-
The function of a closure can be inferred from its name, suggesting that it is related to the concept of scope. A closure itself is a core concept in JavaScript, and being a core concept, it is naturally also a difficult one.
Do you know about the hidden traps in variables in JavaScript?
发布时间:2025/02/21 浏览次数:178 分类:JavaScript
-
Whether you're just starting to learn JavaScript or have been using it for a long time, I believe you'll encounter some traps related to JavaScript variable scope. The goal is to identify these traps before you fall into them, in order to av
How much do you know about the Prototype Chain?
发布时间:2025/02/21 浏览次数:150 分类:JavaScript
-
The prototype chain can be considered one of the core features of JavaScript, and certainly one of its more challenging aspects. If you've learned other object-oriented programming languages, you may find it somewhat confusing when you start
如何在 JavaScript 中合并两个数组而不出现重复的情况
发布时间:2024/03/23 浏览次数:86 分类:JavaScript
-
本教程介绍了如何在 JavaScript 中合并两个数组,以及如何删除任何重复的数组。