如何按值对HashMap进行排序
在Java中,按值对HashMap进行排序很复杂,因为没有可用的直接方法。如果需要按值对HashMap进行排序,则应创建一个
比较器。它根据值比较两个元素。
然后从Map中获取Set元素并将Set转换为List。使用
Collections.sort(List)方法通过传递自定义比较器按值对元素列表进行排序。现在创建一个新的
LinkedHashMap</strong>并将已排序的元素复制到其中。由于
LinkedHashMap</strong>保证了映射的插入顺序。我们得到一个HashMap,其值是按排序的顺序。
Java Collections .sort()方法
Java collections类提供了一种对所有列表实现进行排序的方法,例如
LinkedList 和
ArrayList 。有两种重载的sort方法():
sort(List list): 按其自然顺序升序对列表元素进行排序。
sort(List list, Comparator
<t>
):
它根据比较器包含的顺序对列表中的元素进行排序。
语法
public static <T extends Comparable < ? super T>> void sort (List list)
该方法不返回任何值。它将引发以下异常:
ClassCastException: 如果列表中包含不可相互比较的元素。
UnsupportedOperationException: 指定列表的列表迭代器不支持set操作。
按键和值对HashMap排序的区别在于,它可以具有重复的值,但不能具有重复的键。我们无法使用TreeMap对值进行排序,因为TreeMap按键对元素进行排序。
按值对HashMap进行排序的示例
在以下示例中,我们已经按照升序和降序对Map进行了排序。
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
public class SortByValue {
Map<String, Integer> map = new HashMap<String, Integer>();
public static void main(String[] args) {
SortByValue sv = new SortByValue();
sv.createMap</span>();
System.out.println("Sorting values in ascending order:");
sv.sortByValue(true);
System.out.println("Sorting values in descending order");
sv.sortByValue(false);
}
void createMap() {
map.put("Apple", 65000);
map.put("HP", 20000);
map.put("Dell", 32000);
map.put("Asus", 21478);
map.put("Samsung", 36546);
map.put("Lenovo", 19990);
System.out.println("Before sorting: ");
printMap(map);
}
void sortByValue(boolean order) {
List<Entry< String, Integer>> list = new LinkedList<Entry<String, Integer>>(map.entrySet());
Collections.sort(list, new Comparator<Entry<String, Integer>>() {
public int compare(Entry<String, Integer> o1, Entry<String, Integer> o2) {
if (order) {
return o1.getValue().compareTo(o2.getValue());
}
else {
return o2.getValue().compareTo(o1.getValue());
}
}
}
);
Map<String, Integer> sortedMap = new LinkedHashMap<String, Integer>();
for (Entry<String, Integer> entry : list) {
sortedMap.put(entry.getKey(), entry.getValue());
}
printMap(sortedMap);
}
public void printMap(Map<String, Integer> map) {
System.out.println("Company\t Price ");
for (Entry<String, Integer> entry : map.entrySet()) {
System.out.println(entry.getKey() +"\t"+entry.getValue());
}
System.out.println("\n");
}
}
输出:
Before sorting:
Company Price
Dell 32000
HP 20000
Lenovo 19990
Samsung 36546
Apple 65000
Asus 21478
Sorting values in ascending order:
Company Price
Lenovo 19990
HP 20000
Asus 21478
Dell 32000
Samsung 36546
MAC Book 65000
Sorting values in descending order:
Company Price
MAC Book 65000
Samsung 36546
Dell 32000
Asus 21478
HP 20000
Lenovo 19990