如何在 Java 8 中按键或值对 Map 进行排序

x33g5p2x  于2021-10-16 转载在 Java  
字(3.1k)|赞(0)|评价(0)|浏览(311)

Map 也可以在 Java 8 中使用 stream.sorted() 方法进行排序。我们可以根据其 KeyValueMap 进行排序。

但是在调用 sorted() 方法之前,我们必须将 Map 转换为 Stream,然后我们才能对其进行排序。

1. 如何将 Map 转换为 Stream?

很简单,通过在 Map 对象上调用 entrySet() 方法,它会返回这个映射中包含的映射的 Set 视图。之后,我们可以调用 stream() 方法,该方法返回一个连续的 Stream,以此集合作为其源。

map.entrySet().stream();

2. 按关键字排序

keysMap 对象进行排序。

package org.websparrow.sorting;

import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;

public class MapSortByKey {

	public static void main(String[] args) {

		Map<Integer, String> map = new HashMap<>();
		map.put(114, "Prince");
		map.put(99, "Sandeep");
		map.put(201, "Gaurav");
		map.put(4, "Abhinav");
		map.put(299, "Pallavi");

		System.out.println("--- Unsorted Map ---");
		System.out.println(map);

		System.out.println("--- Sorted Map (Sorted by Key) ---");
		map.entrySet()
				.stream()
				.sorted(Map.Entry.comparingByKey())
				.forEach(System.out::println);

		// Another way to sort a Map by keys
		System.out.println("--- Sorted Map (Sorted by Key) ---");
		map.entrySet()
				.stream()
				.sorted(Comparator.comparing(Map.Entry::getKey))
				.forEach(System.out::println);

	}
}

输出

--- Unsorted Map ---
{114=Prince, 99=Sandeep, 4=Abhinav, 201=Gaurav, 299=Pallavi}
--- Sorted Map (Sorted by Key) ---
4=Abhinav
99=Sandeep
114=Prince
201=Gaurav
299=Pallavi
--- Sorted Map (Sorted by Key) ---
4=Abhinav
99=Sandeep
114=Prince
201=Gaurav
299=Pallavi

或者,我们也可以调用 collect(Collectors.*toMap()*) 方法,该方法默认返回 HashMap,我们需要 LinkedHashMap 来保持订单。

Map<Integer, String> sortedMap = map.entrySet().stream()
		.sorted(Map.Entry.comparingByKey())
		.collect(Collectors.toMap(Map.Entry::getKey,
				Map.Entry::getValue, (oldValue, newValue) -> oldValue,
				LinkedHashMap::new));

System.out.println(sortedMap);

输出

{4=Abhinav, 99=Sandeep, 114=Prince, 201=Gaurav, 299=Pallavi}

3. 按值排序

同样,我们也可以按 Map 对象的 values 对其进行排序。

package org.websparrow.sorting;

import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.stream.Collectors;

public class MapSortByValue {

	public static void main(String[] args) {

		Map<Integer, String> map = new HashMap<>();
		map.put(114, "Prince");
		map.put(99, "Sandeep");
		map.put(201, "Gaurav");
		map.put(4, "Abhinav");
		map.put(299, "Pallavi");

		System.out.println("--- Unsorted Map ---");
		System.out.println(map);

		System.out.println("--- Sorted Map (Sorted by Value) ---");
		map.entrySet()
				.stream()
				.sorted(Map.Entry.comparingByValue())
				.forEach(System.out::println);

		// Another way to sort a Map by values
		System.out.println("--- Sorted Map (Sorted by Value) ---");
		map.entrySet()
				.stream()
				.sorted(Comparator.comparing(Map.Entry::getValue))
				.forEach(System.out::println);

	}
}

输出

--- Unsorted Map ---
{114=Prince, 99=Sandeep, 4=Abhinav, 201=Gaurav, 299=Pallavi}
--- Sorted Map (Sorted by Value) ---
4=Abhinav
201=Gaurav
299=Pallavi
114=Prince
99=Sandeep
--- Sorted Map (Sorted by Value) ---
4=Abhinav
201=Gaurav
299=Pallavi
114=Prince
99=Sandeep

或者

Map<Integer, String> sortedMap = map.entrySet().stream()
		.sorted(Map.Entry.comparingByValue())
		.collect(Collectors.toMap(Map.Entry::getKey,
				Map.Entry::getValue, (oldValue, newValue) -> oldValue,
				LinkedHashMap::new));

System.out.println(sortedMap);

输出

{4=Abhinav, 201=Gaurav, 299=Pallavi, 114=Prince, 99=Sandeep}

相关文章

微信公众号

最新文章

更多