当前位置: 首页 > 知识库问答 >
问题:

按值长度对Map进行排序

董谦
2023-03-14

我想按值长度对Map进行排序。例如,我有这样的代码:

public static void main(String[] args) {
    Map<Integer, Map<Integer, Integer>> map = new HashMap<>();
    Random random = new Random();

    for (int i = 0; i < 5; i++) {
        Map<Integer, Integer> mapA = new HashMap<>();
        for (int j = 0; j < random.nextInt(10); j++) {
            mapA.put(j, j);
        }
        map.put(i, mapA);
    }
    
    for (Map.Entry<Integer, Map<Integer, Integer>> entry:
         map.entrySet()) {
        System.out.println(entry.getKey() + ": " + entry.getValue());
    }
}

结果是:

0: {0=0, 1=1, 2=2, 3=3, 4=4, 5=5}
1: {}
2: {0=0, 1=1, 2=2, 3=3}
3: {0=0, 1=1, 2=2, 3=3}
4: {0=0, 1=1, 2=2}

所以我想做的是按值长度对这个Map进行排序,所以它返回:

1: {}
4: {0=0, 1=1, 2=2}
2: {0=0, 1=1, 2=2, 3=3}
3: {0=0, 1=1, 2=2, 3=3}
0: {0=0, 1=1, 2=2, 3=3, 4=4, 5=5}

共有1个答案

陶琦
2023-03-14

您可以使用Streams来执行此操作:

var sorted = map.entrySet().stream().sorted(Comparator.comparingInt(it -> it.getValue().size())).toList();

基本上,你只需要一个定制的比较器,它将获得映射的值。输入并比较该值的size(),在您的情况下,该值是另一个映射

这里是完整的应用程序:

import java.util.*;

public class Application {

    public static void main(String[] args) {
        Map<Integer, Map<Integer, Integer>> map = new HashMap<>();
        Random random = new Random();

        for (int i = 0; i < 5; i++) {
            Map<Integer, Integer> mapA = new HashMap<>();
            for (int j = 0; j < random.nextInt(10); j++) {
                mapA.put(j, j);
            }
            map.put(i, mapA);
        }

        for (Map.Entry<Integer, Map<Integer, Integer>> entry:
                map.entrySet()) {
            System.out.println(entry.getKey() + ": " + entry.getValue());
        }
        var sorted = map.entrySet().stream().sorted(Comparator.comparingInt(it -> it.getValue().size())).toList();
        System.out.println(sorted);
    }

}

预期产出:

0: {0=0, 1=1}
1: {0=0, 1=1, 2=2, 3=3, 4=4}
2: {}
3: {0=0}
4: {0=0, 1=1, 2=2, 3=3, 4=4, 5=5, 6=6, 7=7}
[2={}, 3={0=0}, 0={0=0, 1=1}, 1={0=0, 1=1, 2=2, 3=3, 4=4}, 4={0=0, 1=1, 2=2, 3=3, 4=4, 5=5, 6=6, 7=7}]

显然,确切的输出取决于随机输入。

 类似资料:
  • 问题内容: 我想按长度顺序排列一个ArrayList字符串,而不仅仅是数字顺序。 例如,该列表包含以下单词: 需要根据它们的长度差异将它们排序为特殊字符串,例如: 因此最终列表如下所示(方括号中的差异): 问题答案: 使用自定义比较器: 然后使用对列表进行排序。

  • 问题内容: 我做了一个字谜游戏机,并且有一系列正面匹配。麻烦的是它们都以不同的顺序排列,我希望能够对数组进行排序,以使最长的数组值首先出现。 有人对如何执行此操作有任何想法吗? 问题答案: 使用http://us2.php.net/manual/en/function.usort.php 使用此自定义功能 如果要保留旧索引,请使用uasort;如果您不关心,请使用usort。 另外,我认为我的版本

  • 我有一个班的学生有以下领域: 字段“状态”可以有2个值:1。现在,2。缺席的 然后我有一个可观察的列表: 因此,我将学生存储在这个列表中。每个学生都有出席或缺席状态。 我需要按状态对这个观察列表进行排序。我希望目前状态的学生在该列表中名列第一。 有什么建议吗? 如果有任何帮助,我将不胜感激。

  • 问题内容: 我一直在寻找按值排序的方法。我找到了这篇文章,它解决了我的排序问题,但不完全是。根据帖子,我编写了以下代码: 输出: 从输出中可以看到,该方法始终返回。原因是我的方法永不返回,我通过发表这篇帖子弄清楚了。 有人在那篇文章中建议了以下方法来解决价值问题: 我已经测试了这段代码,它引入了一个关键的合并问题。换句话说,当值相等时,它们的对应键将合并。 我还尝试了以下方法: 它也不起作用。一些

  • 问题内容: 如果我有一个JavaScript对象,例如: 有没有一种方法可以基于值对属性进行排序?这样我最终 问题答案: 将它们移动到一个数组,对该数组进行排序,然后将其用于您的目的。这是一个解决方案: 拥有数组后,您可以按自己喜欢的顺序从数组中重建对象,从而完全实现了您打算要做的事情。在我所知道的所有浏览器中都可以使用,但这取决于实现的怪癖,并且可能随时中断。您永远不应假设JavaScript对

  • 问题内容: 我发现有很多线程可以按这里的值进行排序,但是它似乎对我不起作用… 我有一个包含元组的列表字典。每个列表都有不同数量的元组。我想按每个列表包含多少个元组对字典进行排序。 这可能吗? 问题答案: d = {“one”: [(1,3),(1,4)], “two”: [(1,2),(1,2),(1,3)], “three”: [(1,1)]} >>> for k in sorted(d, ke