个性化阅读
专注于IT技术分析

如何按值对HashMap进行排序

在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

赞(0)
未经允许不得转载:srcmini » 如何按值对HashMap进行排序

评论 抢沙发

评论前必须登录!