如果是按键排序,我们可以用TreeMap;
但如果是按值排序呢?
比如要将一个文件中的单词按出现次数进行统计。
import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; public class Solution { public static void main(String[] args) { HashMap<String, Integer> map = new HashMap<String, Integer>(); map.put("a", 10); map.put("b", 30); map.put("c", 50); map.put("d", 40); map.put("e", 20); System.out.println(map); TreeMap<String, Integer> sortedMap = SortByValue(map); System.out.println(sortedMap); } public static TreeMap<String, Integer> SortByValue( HashMap<String, Integer> map) { ValueComparator vc = new ValueComparator(map); TreeMap<String, Integer> sortedMap = new TreeMap<String, Integer>(vc); sortedMap.putAll(map); return sortedMap; } } class ValueComparator implements Comparator<String> { Map<String, Integer> map; public ValueComparator(Map<String, Integer> base) { this.map = base; } public int compare(String a, String b) { if (map.get(a) >= map.get(b)) { return -1; } else { return 1; } // returning 0 would merge keys } }
这种方式虽然有效,但只能用于 HashMap<String, Integer>。
第二种方式:
import java.util.Comparator; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; public class Solution { public static void main(String[] args) { HashMap<String, Integer> map = new HashMap<String, Integer>(); map.put("a", 10); map.put("b", 30); map.put("c", 50); map.put("d", 40); map.put("e", 20); System.out.println(map); Map sortedMap = sortByValue(map); System.out.println(sortedMap); } public static Map sortByValue(Map unsortedMap) { Map sortedMap = new TreeMap(new ValueComparator(unsortedMap)); sortedMap.putAll(unsortedMap); return sortedMap; } } class ValueComparator implements Comparator { Map map; public ValueComparator(Map map) { this.map = map; } public int compare(Object keyA, Object keyB) { Comparable valueA = (Comparable) map.get(keyA); Comparable valueB = (Comparable) map.get(keyB); return valueB.compareTo(valueA); } }
考虑到类型安全,这种方式是不被推荐的,但也算是提供了一种做法。
另外一种方式:
public static Map sortByValue(Map unsortMap) { List list = new LinkedList(unsortMap.entrySet()); Collections.sort(list, new Comparator() { public int compare(Object o1, Object o2) { return ((Comparable) ((Map.Entry) (o1)).getValue()) .compareTo(((Map.Entry) (o2)).getValue()); } }); Map sortedMap = new LinkedHashMap(); for (Iterator it = list.iterator(); it.hasNext();) { Map.Entry entry = (Map.Entry) it.next(); sortedMap.put(entry.getKey(), entry.getValue()); } return sortedMap; }
如果有其他更好的,记得分享哦;
相关推荐
下面,我们将详细地介绍Java Map的按键排序和按值排序。 按键排序(sort by key) Java中的TreeMap,V>类可以实现Map的按键排序。TreeMap,V>是一个基于红黑树的实现,它可以保证映射按照升序顺序排列关键字。TreeMap,...
这样,当添加Pair对象到TreeSet时,它们将按值排序。 ```java import java.util.*; class Pair implements Comparable<Pair> { // 类的定义与之前的代码相同 } public class Main { public static void main...
在给定的代码中,有一个名为`mapSortByKey`的方法,该方法接收一个未排序的`Map, Integer>`作为参数,并返回一个按键排序的`SortedMap, Integer>`。这个方法的关键在于使用了`TreeMap`类,因为`TreeMap`是实现了`...
在介绍Map排序之前,了解`merge()`函数很有帮助。`merge()`用于处理键值对插入时的键冲突问题。当插入的键已经存在于Map中时,`merge()`会使用提供的合并函数来决定新值。例如,我们可以使用lambda表达式 `(oldVal, ...
在标准的JDK中,Map接口本身并不支持按值排序,因为它的设计目的是按键排序。但是,通过一些技巧,我们可以实现按值排序。 对于`TreeMap`,我们可以通过创建一个内部类作为Comparator,该Comparator比较键值对的值...
如果需要按键排序或自定义排序,那么`TreeMap`更为合适;而如果要在多线程环境下使用,`Hashtable`是一个选项,尽管现代的`ConcurrentHashMap`可能更适合并发环境。 总的来说,理解和熟练掌握这些Map实现类及其排序...
本文将深入讲解如何使用Stream API对Map进行排序,包括按键排序、按值排序以及使用`merge()`函数处理键值冲突。 首先,让我们了解一下Java 8 Stream的基本概念。Stream API允许我们对集合进行一系列操作,如过滤、...
总结来说,通过自定义`Comparator`并结合`Arrays.sort()`方法,我们可以对`Map`进行定制化的排序,无论是按值升序排序还是按键排序。但要注意,这种方法只是返回了一个排序后的`Entry`数组,并未改变原`Map`的顺序。...
虽然这里提到的是按值排序,但在Rust的标准库中,`BTreeMap`默认是按键进行排序的。若要实现按值排序,我们需要自定义比较器并传递给`BTreeMap`。 实现按值排序的关键在于自定义`Ord` Trait,这是Rust中用于定义...
标题中的“Map排序”指的是在Java编程中对Map集合进行排序的操作。Map接口在Java中是一种非常重要的数据结构,它存储键值对(key-value pairs),其中键是唯一的。默认情况下,Map并不保证其元素的顺序,但有些场景下...
总结来说,Java中的Map可以根据需求选择不同的实现进行排序,如按键排序可直接使用TreeMap,而按值排序则需要额外的转换和排序操作。在实际开发中,选择合适的Map类型和排序策略对于优化代码性能和提高代码可读性至...
无论是按键还是按值排序,都需要根据实际需求选择合适的方法。通过使用`Comparator`接口或自定义比较器,我们可以轻松地实现不同类型的排序操作。这对于处理大量数据时保持数据的有序性非常重要。
与按键排序类似,这里也是先将`Hashtable`的条目集转换为数组,然后使用自定义比较器进行排序。然而,这里比较的是值,假设值可以被转换为整数进行比较。如果值不是数字,或者不是可比较类型,则需要相应的处理逻辑...
该方法允许用户使用自定义的排序方法,可以按键进行排序,或者按值进行排序。下面是一个简单的示例代码: ```java Map, Integer> map_Data = new HashMap, Integer>(); map_Data.put("A", 98); map_Data.put("B", ...
在Java编程语言中,集合框架是提供了一个设计用于存储对象集合的...TreeMap用于当你需要按键排序的时候;而ConcurrentHashMap则用于高度并发的环境。了解这些类的特性和行为对于编写高效且健壮的Java程序是十分必要的。
- **HashMap** vs **TreeMap**:`HashMap`提供更快的访问速度,`TreeMap`支持按键排序。 以上是对Java集合框架中几个关键概念的详细介绍。掌握这些基础知识,可以帮助开发者更高效地处理数据结构问题,提高代码质量...
本文将深入探讨Java集合框架的四大核心组件:`Collection`、`List`、`Map`和`Set`,以及它们的排序方法。 ### 1. 集合框架概述 #### 1.1.1 容器简介 在Java中,容器(Containers)是用来存储和管理对象的结构。...
- 在需要按照特定顺序(如按键排序)遍历时,可以先对键集合进行排序,再进行遍历。 - 如果需要根据特定的键执行某些操作,则该方法非常适合。 #### 3. 利用`entrySet()`遍历 `entrySet()`方法返回一个包含Map中...
- **TreeMap**: 使用红黑树实现排序功能,提供按自然顺序或自定义比较器排序的键值对存储。`TreeMap`不允许键为null,且不会出现重复的键。 - **LinkedHashMap**: 继承自`HashMap`,在维护键值对的同时保持了插入...