如何在 Java 中按值排序 Map
Mohammad Irfan
2023年10月12日
-
在 Java 中使用
sort()
方法對一個Map
進行排序 -
在 Java 中使用
sorted()
方法對Map
進行排序 -
在 Java 中使用
Comparator
的sort()
方法對Map<key, value>
進行排序 -
使用 Java 中的
sorted()
和toMap()
方法對一個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 中使用 Comparator
的 sort()
方法對 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