在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中按键或值对地图进行排序[重复]的主要内容,如果未能解决你的问题,请参考以下文章

按键值对 JSON 数据进行排序

按键和值对地图排序

Java HashMap 按键插入时间排序 - 创意顺序 [重复]

按值对HashMap进行排序[重复]

根据Java中的值对地图进行排序的最简单方法是啥?

按值对字典进行排序[重复]