在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 HashMap
Map<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 in descending order");
sv.sortByValue(false);
}
//method to add elements in the HashMap
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);
}
//sort elements by values
void sortByValue(boolean order)
{
//convert HashMap into List
List<Entry<String, Integer>> list = new LinkedList<Entry<String, Integer>>(map.entrySet());
//sorting the list elements
Collections.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 integer
return o1.getValue().compareTo(o2.getValue());}
else
{
return o2.getValue().compareTo(o1.getValue());
}
}
});
//prints the sorted HashMap
Map<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 elements
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
评论前必须登录!
注册