在Java中按键或值对地图进行排序[重复]
Posted
技术标签:
【中文标题】在Java中按键或值对地图进行排序[重复]【英文标题】:Sort a Map by key or Value in Java [duplicate] 【发布时间】:2019-07-21 09:30:04 【问题描述】:在 java 中按键或按值对 Map 进行排序
输入映射1-eee 4-ddd 5-ccc 0-bbb 3-aaa
第一个输出映射(按键):0-bbb 1-eee 3-aaa 4-ddd 5-ccc
第二个输出映射(按值):3-aaa 0-bbb 5-ccc 4-ddd 1-eee
【问题讨论】:
您无法对HashMap
进行排序。如果您需要对其进行排序,请切换到TreeMap
。
您好,欢迎来到 ***!你好像有印象……等一下……你是两年会员?!
@Turing85 您是否注意到这是一个自我回答的问题,所以可能没有提到idownvotedbecau.se
原因适用于此处,因为:OP 发布了他的代码(在回答中但仍然),它显示了尝试,并且是可能是经过一些研究后写的:)
@Pshemo 嗯嗯,^^ 会删除那些评论
【参考方案1】:
此代码将首先按键对地图进行排序,然后按值对地图进行排序。 只需编写一个main方法并调用该方法如下:
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
public class SortMapByKeyAndValue
public static void main(String[] args)
aMapSortProgramByKeyAndValue();
private static void aMapSortProgramByKeyAndValue()
Map<String, Integer> myMap = new HashMap<String, Integer>();
// putting values in the Map
myMap.put("Jayant", 80);
myMap.put("Abhishek", 90);
myMap.put("Anushka", 80);
myMap.put("Amit", 75);
myMap.put("Spandan", 50);
myMap.put("Hari", 55);
myMap.put("Keshav", 60);
System.out.println("Map data without Sort :-");
for (Entry<String, Integer> myEntryMapData : myMap.entrySet())
System.out.println("The Map data is Key: " + myEntryMapData.getKey() + " Value: "
+ myEntryMapData.getValue());
List<Entry<String, Integer>> myMapDataAsList = new ArrayList<Map.Entry<String, Integer>>();
myMapDataAsList.addAll(myMap.entrySet());
System.out.println("Map data Stored in List, The whole List is : " + myMapDataAsList);
Iterator<Entry<String, Integer>> myListIterator = myMapDataAsList.iterator();
System.out.println("Map data Stored in List, Print through iterator :-");
for (; myListIterator.hasNext();)
Entry<String, Integer> myListData = myListIterator.next();
System.out.println("The List data is Key: " + myListData.getKey() + " Value: " + myListData.getValue());
Collections.sort(myMapDataAsList, new Comparator<Entry<String, Integer>>()
@Override
public int compare(Entry<String, Integer> dataOne, Entry<String, Integer> dataTwo)
return dataOne.getKey().compareTo(dataTwo.getKey());
);
System.out.println("After Sort by the Key the Map data is : ");
myListIterator = myMapDataAsList.iterator();
for (; myListIterator.hasNext();)
Entry<String, Integer> myListData = myListIterator.next();
System.out.println("The List data is Key: " + myListData.getKey() + " Value: " + myListData.getValue());
Collections.sort(myMapDataAsList, new Comparator<Entry<String, Integer>>()
@Override
public int compare(Entry<String, Integer> dataOne, Entry<String, Integer> dataTwo)
return dataOne.getValue().compareTo(dataTwo.getValue());
);
System.out.println("After Sort by the vale the Map data is : ");
myListIterator = myMapDataAsList.iterator();
for (; myListIterator.hasNext();)
Entry<String, Integer> myListData = myListIterator.next();
System.out.println("The List data is Key: " + myListData.getKey() + " Value: " + myListData.getValue());
【讨论】:
为什么不编辑上一个答案而不是添加一个新答案?除此之外,您的“解释”非常少。 你好@Spandan。虽然很高兴您想分享一些知识,但请尽量确保您不会重复已经提出的问题,例如Sort a Map<Key, Value> by values。我们尝试将有关特定主题的知识集中在一个地方,以便更容易找到(或在需要时更正)。我们还将同一主题的其他问题标记为重复,以将其他问题指向该主要问题。还要确保您没有重复已经提供的解决方案。除此之外,您应该没问题(至少在自我回答问题部分)。祝你好运! @Turing85,这是两种不同的方法。 @Pshemo,我已经分享了一个答案,它主要是一个实用类,它将根据要求对地图进行排序:1.按键排序和2.按值排序。这是我们的业务需求,我也使用了 LinkedHashMap,因为我们的需求是对部分数据进行排序,而不是全部,所以在这种情况下我已经分享了我的努力,以便其他人也可以参考,如果需要。 @Turing85 和 Pshemo 如果你能审阅它并提供你的投票,我将非常高兴,这将使我有信心在未来也这样做。提前非常感谢!!!【参考方案2】:import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
public class MapSortUtil
public static Map<String, String> sortMapByKey(Map<String, String> anUnSortedMap)
List<Entry<String, String>> myListOfEntrySet = getListOfEntrySetFromMap(anUnSortedMap);
/* Sort the list of entry-set in ascending order. */
Collections.sort(myListOfEntrySet, new MapComparatorToSortByKey());
/* Generating new Map from Sorted Entry List. */
Map<String, String> mySortedMap = getSortedMapFromSortedEntry(myListOfEntrySet);
return mySortedMap;
public static Map<String, String> sortMapByValue(Map<String, String> anUnSortedMap)
List<Entry<String, String>> myListOfEntrySet = getListOfEntrySetFromMap(anUnSortedMap);
/* Sort the list of entry-set in ascending order. */
Collections.sort(myListOfEntrySet, new MapComparatorToSortByValue());
/* Generating new Map from Sorted Entry List. */
Map<String, String> mySortedMap = getSortedMapFromSortedEntry(myListOfEntrySet);
return mySortedMap;
private static List<Entry<String, String>> getListOfEntrySetFromMap(Map<String, String> anUnSortedMap)
/* Getting Entry Set from the Map. */
Set<Entry<String, String>> myEntrySetOfMap = anUnSortedMap.entrySet();
/* Creating List of Entry Set. */
List<Entry<String, String>> myListOfEntrySet = new LinkedList<Map.Entry<String, String>>(myEntrySetOfMap);
return myListOfEntrySet;
private static Map<String, String> getSortedMapFromSortedEntry(List<Entry<String, String>> myListOfEntrySetOfMap)
/* Add Sorted list in new LinkedHashMap one-by-one. */
Map<String, String> mySortedLinkedHashMap = new LinkedHashMap<String, String>();
for (Entry<String, String> myOneByOneData : myListOfEntrySetOfMap)
mySortedLinkedHashMap.put(myOneByOneData.getKey(), myOneByOneData.getValue());
return mySortedLinkedHashMap;
class MapComparatorToSortByValue implements Comparator<Entry<String, String>>
@Override
public int compare(Entry<String, String> aMap1, Entry<String, String> aMap2)
return aMap1.getValue().compareTo(aMap2.getValue());
class MapComparatorToSortByKey implements Comparator<Entry<String, String>>
@Override
public int compare(Entry<String, String> aMap1, Entry<String, String> aMap2)
return aMap1.getKey().compareTo(aMap2.getKey());
【讨论】:
非常不鼓励仅使用代码的答案。您应该解释手头的问题,以及您的解决方案解决问题的方式。不,我没有否决您的回答。 不要重新发明***。TreeMap
已经做到了这一点并进行了高度优化。
@BackSlash,这是我们的业务需求,我也使用了 LinkedHashMap,因为我们的要求是对部分数据进行排序,而不是全部,所以在这种情况下,我已经分享了我的努力,以便其他人也可以参考,如果需要.另外我要返回 Map 所以它几乎可以与所有子类型一起使用。如果您能审阅它并提供您的投票,那将是非常高兴的,这将使我有信心在未来也这样做。提前非常感谢!!!
@Turing85,非常感谢您的意见和间接支持!!!当然,我会从下一次开始处理这个问题。以上是关于在Java中按键或值对地图进行排序[重复]的主要内容,如果未能解决你的问题,请参考以下文章