当前位置: 首页 > 面试题库 >

Java按值对HashMap排序

蒲功
2023-03-14
问题内容

我需要HashMap根据存储在其中的值对我进行排序。在HashMap包含存储在手机联系人的名字。

另外,我还要求在对值进行排序时对键进行自动排序,否则你可以说键和值绑定在一起,因此值的任何更改都应反映在键中。

HashMap<Integer,String> map = new HashMap<Integer,String>();
map.put(1,"froyo");
map.put(2,"abby");
map.put(3,"denver");
map.put(4,"frost");
map.put(5,"daisy");

要求的输出:

2,abby;
5,daisy;
3,denver;
4,frost;
1,froyo;

问题答案:

尝试下面的代码对我来说很好。你可以选择升序和降序

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 SortMapByValue
{
    public static boolean ASC = true;
    public static boolean DESC = false;

    public static void main(String[] args)
    {

        // Creating dummy unsorted map
        Map<String, Integer> unsortMap = new HashMap<String, Integer>();
        unsortMap.put("B", 55);
        unsortMap.put("A", 80);
        unsortMap.put("D", 20);
        unsortMap.put("C", 70);

        System.out.println("Before sorting......");
        printMap(unsortMap);

        System.out.println("After sorting ascending order......");
        Map<String, Integer> sortedMapAsc = sortByComparator(unsortMap, ASC);
        printMap(sortedMapAsc);


        System.out.println("After sorting descindeng order......");
        Map<String, Integer> sortedMapDesc = sortByComparator(unsortMap, DESC);
        printMap(sortedMapDesc);

    }

    private static Map<String, Integer> sortByComparator(Map<String, Integer> unsortMap, final boolean order)
    {

        List<Entry<String, Integer>> list = new LinkedList<Entry<String, Integer>>(unsortMap.entrySet());

        // Sorting the list based on values
        Collections.sort(list, new Comparator<Entry<String, Integer>>()
        {
            public int compare(Entry<String, Integer> o1,
                    Entry<String, Integer> o2)
            {
                if (order)
                {
                    return o1.getValue().compareTo(o2.getValue());
                }
                else
                {
                    return o2.getValue().compareTo(o1.getValue());

                }
            }
        });

        // Maintaining insertion order with the help of LinkedList
        Map<String, Integer> sortedMap = new LinkedHashMap<String, Integer>();
        for (Entry<String, Integer> entry : list)
        {
            sortedMap.put(entry.getKey(), entry.getValue());
        }

        return sortedMap;
    }

    public static void printMap(Map<String, Integer> map)
    {
        for (Entry<String, Integer> entry : map.entrySet())
        {
            System.out.println("Key : " + entry.getKey() + " Value : "+ entry.getValue());
        }
    }
}

编辑:版本2

使用了新的Java功能,例如流for-each等

如果值相同,则地图将按键排序

 import java.util.*;
 import java.util.Map.Entry;
 import java.util.stream.Collectors;

 public class SortMapByValue

 {
    private static boolean ASC = true;
    private static boolean DESC = false;
    public static void main(String[] args)
    {

        // Creating dummy unsorted map
        Map<String, Integer> unsortMap = new HashMap<>();
        unsortMap.put("B", 55);
        unsortMap.put("A", 20);
        unsortMap.put("D", 20);
        unsortMap.put("C", 70);

        System.out.println("Before sorting......");
        printMap(unsortMap);

        System.out.println("After sorting ascending order......");
        Map<String, Integer> sortedMapAsc = sortByValue(unsortMap, ASC);
        printMap(sortedMapAsc);


        System.out.println("After sorting descending order......");
        Map<String, Integer> sortedMapDesc = sortByValue(unsortMap, DESC);
        printMap(sortedMapDesc);
    }

    private static Map<String, Integer> sortByValue(Map<String, Integer> unsortMap, final boolean order)
    {
        List<Entry<String, Integer>> list = new LinkedList<>(unsortMap.entrySet());

        // Sorting the list based on values
        list.sort((o1, o2) -> order ? o1.getValue().compareTo(o2.getValue()) == 0
                ? o1.getKey().compareTo(o2.getKey())
                : o1.getValue().compareTo(o2.getValue()) : o2.getValue().compareTo(o1.getValue()) == 0
                ? o2.getKey().compareTo(o1.getKey())
                : o2.getValue().compareTo(o1.getValue()));
        return list.stream().collect(Collectors.toMap(Entry::getKey, Entry::getValue, (a, b) -> b, LinkedHashMap::new));

    }

    private static void printMap(Map<String, Integer> map)
    {
        map.forEach((key, value) -> System.out.println("Key : " + key + " Value : " + value));
    }
}


 类似资料:
  • 问题内容: 你好,我需要实现一个接收HashMap并按键对它的值进行排序(mergeSort)的方法 (不使用TreeMap,SortedMap或Collections.Sort或使用JAVA Packages中的任何排序解决方案) 。我的问题是处理通配符类型…这是我的实现(由于使用通配符而返回编译错误) 我感谢您的帮助! 问题答案: 像其他评论者一样,我建议您阅读Java中的泛型主题。您在合并中

  • 我有一个HashMap与作为关键和一个值作为价值。 我的目标是通过降序值对Hashmap进行排序。应在

  • 我试图排序的hashmap的结构的值从高到低。 我在下面创建了一个函数来对数据进行排序。 我收到以下错误: 异常在线程"main"java.lang.ClassCastException:类java.lang.String不能转换为类java.lang.整数(java.lang.String和java.lang.整数在加载器'bootstrap'的模块java.base) 我相信我的错误是由上面的

  • 边走边学Java(Python背景)。简单的单词计数程序在Java7代码(不能用J8!)。 我有一个单词的哈希图:计数对。现在我需要按计数(递减顺序)排序,并打破按字母顺序使用word的联系。 我正在寻找对这个想法的反馈: 遍历HashMap中的映射项(me) 使用me.getkey=K和me.getvalue=v new map.entry reverse_me=(V,K){不确定此语法} 将r

  • 问题内容: 我需要像TreeMap这样排序的地图,但按值排序。我的地图很大,所以我不能随时随地对我的地图进行排序。是否存在解决此问题的良好解决方案?也许存在外部罐子遇到这个? 问题答案: 有多种方法可以满足您的要求。正如您随后澄清的那样,您当前可能有重复的对象,也许您可​​以用第三方多重映射(Guava,Apache Commons Collections )替换您的对象,然后交换您的键和值- 即

  • 我有一个<code>HashMap 有没有比排序HashMap更好的解决方案,然后使用 顺便说一句,我一开始并不一定要使用HashMap,但值设置了顺序,我不想交换键和值,因为浮点值可能会改变好几次。