如何在 Java 中按值排序 Map

Mohammad Irfan 2023年1月30日 2020年10月27日
  1. 在 Java 中使用 sort() 方法對一個 Map 進行排序
  2. 在 Java 中使用 sorted() 方法對 Map 進行排序
  3. 在 Java 中使用 Comparatorsort() 方法對 Map<key, value> 進行排序
  4. 使用 Java 中的 sorted()toMap() 方法對一個 Map 進行排序
  5. 在 Java 中使用自定義程式碼對一個 Map 進行排序
如何在 Java 中按值排序 Map

本教程介紹瞭如何在 Java 中按值對 Map<key, value> 進行排序,並列出了一些示例程式碼來理解它。

有幾種方法可以對 Map 進行排序。這裡我們用到了 sort()sorted() 方法和 Comparator 介面等。我們來看看例子。

在 Java 中使用 sort() 方法對一個 Map 進行排序

我們可以使用 List 介面的 sort() 方法對 Map 的元素進行排序。sort() 方法將元素按升序排序,我們通過 comparingByValue() 方法指定按值排序。請看下面的例子。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class SimpleTesting {
	public static void main(String[] args){
		Map<Integer, Integer> map = new HashMap<>();
		map.put(2, 1020);
		map.put(3, 300);
		map.put(1, 100);
		map.put(5, 500);
		map.forEach((k,v)->System.out.println(k+"="+v));
		System.out.println("After Sorting by value");
		List<Entry<Integer, Integer>> list = new ArrayList<>(map.entrySet());
		list.sort(Entry.comparingByValue());
		list.forEach(System.out::println);
	}
}

輸出:

1=100
2=1020
3=300
5=500
After Sorting
1=100
3=300
5=500
2=1020

在 Java 中使用 sorted() 方法對 Map 進行排序

如果你正在使用流,你可以使用 sorted() 方法,按升序對元素進行排序。我們將 Map.Entry.comparingByValue() 作為引數傳遞給 sorted() 方法,以按值對 Map<key, value> 進行排序。

import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;

public class SimpleTesting {
	public static void main(String[] args){
		Map<Integer, Integer> map = new HashMap<>();
		map.put(2, 1020);
		map.put(3, 300);
		map.put(1, 100);
		map.put(5, 500);
		map.forEach((k,v)->System.out.println(k+"="+v));
		System.out.println("After Sorting by value");
		Stream<Map.Entry<Integer, Integer>> sorted =
			    map.entrySet().stream()
			       .sorted(Map.Entry.comparingByValue());
		sorted.forEach(System.out::println);
	}
}

輸出:

1=100
2=1020
3=300
5=500
After Sorting by value
1=100
3=300
5=500
2=1020

在 Java 中使用 Comparatorsort() 方法對 Map<key, value> 進行排序

在這個例子中,我們使用 compareTo() 方法來比較 sort() 方法內部的 Map<key, value> 的值作為引數。你可以看到,我們建立了一個 Comparator 介面的匿名內類,並定義了 compare() 方法來比較這些值。

import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class SimpleTesting {
	public static void main(String[] args){
		Map<Integer, Integer> map = new HashMap<>();
		map.put(2, 1020);
		map.put(3, 300);
		map.put(1, 100);
		map.put(5, 500);
		map.forEach((k,v)->System.out.println(k+"="+v));
		System.out.println("After Sorting by value");
		 List<Entry<Integer, Integer>> list = new LinkedList<>(map.entrySet());
		    Collections.sort(list, new Comparator<Object>() {
		       @SuppressWarnings("unchecked")
			public int compare(Object o1, Object o2) {
		            return ((Comparable<Integer>) ((Map.Entry<Integer, Integer>) (o1)).getValue()).compareTo(((Map.Entry<Integer, Integer>) (o2)).getValue());
		        }
		    });
		    Map<Integer, Integer> result = new LinkedHashMap<>();
		    for (Iterator<Entry<Integer, Integer>> it = list.iterator(); it.hasNext();) {
		        Map.Entry<Integer, Integer> entry = (Map.Entry<Integer, Integer>) it.next();
		        result.put(entry.getKey(), entry.getValue());
		    }
		    result.forEach((k,v)->System.out.println(k+"="+v));
	}
}

輸出:

1=100
2=1020
3=300
5=500
After Sorting by value
1=100
3=300
5=500
2=1020

使用 Java 中的 sorted()toMap() 方法對一個 Map 進行排序

在這個例子中,我們使用 sorted() 方法對 Map<key, value> 進行排序,並使用 toMap() 方法將結果收集到 LinkedHashMap 中。在這裡,我們使用方法引用的概念來建立一個 LinkedHashMap 物件。

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

public class SimpleTesting {
	public static void main(String[] args){
		Map<Integer, Integer> map = new HashMap<>();
		map.put(2, 1020);
		map.put(3, 300);
		map.put(1, 100);
		map.put(5, 500);
		map.forEach((k,v)->System.out.println(k+"="+v));
		System.out.println("After Sorting by value");
		Map<Integer, Integer> result = map.entrySet().stream()
                .sorted(Entry.comparingByValue())
                .collect(Collectors.toMap(Entry::getKey, Entry::getValue, (e1, e2) -> e1, LinkedHashMap::new));
		    result.forEach((k,v)->System.out.println(k+"="+v));		    
	}
}

輸出:

1=100
2=1020
3=300
5=500
After Sorting by value
1=100
3=300
5=500
2=1020

在 Java 中使用自定義程式碼對一個 Map 進行排序

在這裡,我們建立了一個實現 Comparator 介面的使用者自定義類,並將其物件傳遞給 TreeMap,以獲得按值排序的 Map<key, value>

import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
class UserComparator implements Comparator<Object> {
	Map<Integer, Integer> map;
	public UserComparator(Map<Integer, Integer> map) {
		this.map = map;
	}
	public int compare(Object o1, Object o2) {
		if (map.get(o2) == map.get(o1))
			return 1;
		else
			return ((Integer) map.get(o1)).compareTo((Integer)     
					map.get(o2));
	}
}
public class SimpleTesting {
	public static void main(String[] args){
		Map<Integer, Integer> map = new HashMap<>();
		map.put(2, 1020);
		map.put(3, 300);
		map.put(1, 100);
		map.put(5, 500);
		map.forEach((k,v)->System.out.println(k+"="+v));
		System.out.println("After Sorting by value");
		UserComparator comparator = new UserComparator(map);
	    Map<Integer, Integer> result = new TreeMap<Integer, Integer>(comparator);
	    result.putAll(map);
		result.forEach((k,v)->System.out.println(k+"="+v));
	}
}

輸出:

1=100
2=1020
3=300
5=500
After Sorting by value
1=100
3=300
5=500
2=1020

相關文章 - Java Map