`
还在吗
  • 浏览: 2075 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

将Map按值排序,而不是按键排序

    博客分类:
  • Java
阅读更多

如果是按键排序,我们可以用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按键排序和按值排序

    下面,我们将详细地介绍Java Map的按键排序和按值排序。 按键排序(sort by key) Java中的TreeMap,V&gt;类可以实现Map的按键排序。TreeMap,V&gt;是一个基于红黑树的实现,它可以保证映射按照升序顺序排列关键字。TreeMap,...

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

    这样,当添加Pair对象到TreeSet时,它们将按值排序。 ```java import java.util.*; class Pair implements Comparable&lt;Pair&gt; { // 类的定义与之前的代码相同 } public class Main { public static void main...

    对于java map类排序

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

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

    在介绍Map排序之前,了解`merge()`函数很有帮助。`merge()`用于处理键值对插入时的键冲突问题。当插入的键已经存在于Map中时,`merge()`会使用提供的合并函数来决定新值。例如,我们可以使用lambda表达式 `(oldVal, ...

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

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

    java map实例,排序

    如果需要按键排序或自定义排序,那么`TreeMap`更为合适;而如果要在多线程环境下使用,`Hashtable`是一个选项,尽管现代的`ConcurrentHashMap`可能更适合并发环境。 总的来说,理解和熟练掌握这些Map实现类及其排序...

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

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

    map实现按value升序排序

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

    ordered-map:按值排序的HashMap

    虽然这里提到的是按值排序,但在Rust的标准库中,`BTreeMap`默认是按键进行排序的。若要实现按值排序,我们需要自定义比较器并传递给`BTreeMap`。 实现按值排序的关键在于自定义`Ord` Trait,这是Rust中用于定义...

    Map排序

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

    Java中Map的排序问题详解

    总结来说,Java中的Map可以根据需求选择不同的实现进行排序,如按键排序可直接使用TreeMap,而按值排序则需要额外的转换和排序操作。在实际开发中,选择合适的Map类型和排序策略对于优化代码性能和提高代码可读性至...

    HashMap排序

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

    HashTable排序.txt

    与按键排序类似,这里也是先将`Hashtable`的条目集转换为数组,然后使用自定义比较器进行排序。然而,这里比较的是值,假设值可以被转换为整数进行比较。如果值不是数字,或者不是可比较类型,则需要相应的处理逻辑...

    Java Map的排序实例详解

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

    Map集合的继承关系图.pdf

    在Java编程语言中,集合框架是提供了一个设计用于存储对象集合的...TreeMap用于当你需要按键排序的时候;而ConcurrentHashMap则用于高度并发的环境。了解这些类的特性和行为对于编写高效且健壮的Java程序是十分必要的。

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

    - **HashMap** vs **TreeMap**:`HashMap`提供更快的访问速度,`TreeMap`支持按键排序。 以上是对Java集合框架中几个关键概念的详细介绍。掌握这些基础知识,可以帮助开发者更高效地处理数据结构问题,提高代码质量...

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

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

    java集合MAP三种遍历

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

    对java中Map集合的讲解

    - **TreeMap**: 使用红黑树实现排序功能,提供按自然顺序或自定义比较器排序的键值对存储。`TreeMap`不允许键为null,且不会出现重复的键。 - **LinkedHashMap**: 继承自`HashMap`,在维护键值对的同时保持了插入...

Global site tag (gtag.js) - Google Analytics