在Java中, 由于没有可用的直接方法, 因此按值对HashMap进行排序很复杂。如果需要按值对HashMap进行排序, 则应创建一个Comparator。它根据值比较两个元素。
之后, 从Map中获取元素集并将Set转换为List。使用Collections.sort(List)方法通过传递自定义的比较器按值对元素列表进行排序。现在创建一个新的LinkedHashMap并将已排序的元素复制到其中。由于LinkedHashMap保证了映射的插入顺序。我们得到一个HashMap, 其值按排序顺序。
Java Collections.sort()方法Java collections类提供了一种对所有列表实现(例如LinkedList和ArrayList)进行排序的方法。有两个重载的sort方法():
- sort(List 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的示例
在下面的示例中, 我们按升序和降序对地图进行了排序。
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 {//implementation of HashMapMap<
String, Integer>
map = new HashMap<
String, Integer>
();
public static void main(String[] args) { SortByValue sv = new SortByValue();
sv.createMap();
System.out.println("Sorting values in ascending order:");
sv.sortByValue(true);
System.out.println("Sorting values indescending order");
sv.sortByValue(false);
}//method to add elements in the HashMapvoid 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);
}//sort elements by valuesvoid sortByValue(boolean order) {//convert HashMap into List List<
Entry<
String, Integer>
>
list = new LinkedList<
Entry<
String, Integer>
>
(map.entrySet());
//sorting the list elementsCollections.sort(list, new Comparator<
Entry<
String, Integer>
>
() {public int compare(Entry<
String, Integer>
o1, Entry<
String, Integer>
o2) {if (order) {//compare two object and return an integerreturn o1.getValue().compareTo(o2.getValue());
} else {return o2.getValue().compareTo(o1.getValue());
}}});
//prints the sorted HashMapMap<
String, Integer>
sortedMap = new LinkedHashMap<
String, Integer>
();
for (Entry<
String, Integer>
entry : list) {sortedMap.put(entry.getKey(), entry.getValue());
}printMap(sortedMap);
}//method for printing the elementspublic 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");
}}
【如何按值对HashMap进行排序】输出:
Before sorting: CompanyPrice Dell32000HP20000Lenovo 19990Samsung 36546Apple65000Asus21478Sorting values in ascending order:CompanyPrice Lenovo 19990HP20000Asus21478Dell32000Samsung 36546MAC Book 65000Sorting values in descending order:CompanyPrice MAC Book 65000Samsung 36546Dell32000Asus21478HP20000Lenovo 19990
推荐阅读
- 如何在Eclipse中运行Java程序
- 如何在Windows 10中运行Java程序
- 如何从Java中的字符串中删除特殊字符
- 如何逐字反转Java Word中的字符串
- 如何用Java返回数组
- 如何在Java中保留字符串而不使用反转功能
- 如何在Java中逐行读取文件
- 如何在Java中读取XML文件
- 路由基础之OSPF NSSA区域