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

Java Map按值排序

蓬森
2023-03-14
问题内容

我一直在寻找Map<String,http://codingdict.com/questions/12636Integer>按值排序的方法。我找到了这篇文章,它解决了我的排序问题,但不完全是。根据帖子,我编写了以下代码:

import java.util.*;

public class Sort {

    static class ValueComparator implements Comparator<String> {

        Map<String, Integer> base;

        ValueComparator(Map<String, Integer> base) {
            this.base = base;
        }

        @Override
        public int compare(String a, String b) {
            if (base.get(a) >= base.get(b)) {
                return 1;
            } else {
                return -1;
            }
        }
    }

    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<String, Integer>();
        ValueComparator vc = new ValueComparator(map);
        TreeMap<String, Integer> sorted = new TreeMap<String, Integer>(vc);
        map.put("A", 1);
        map.put("B", 2);
        sorted.putAll(map);
        for (String key : sorted.keySet()) {
            System.out.println(key + " : " + sorted.get(key)); // why null values here?
        }
        System.out.println(sorted.values()); // But we do have non-null values here!
    }
}

输出:

A : null
B : null
[1, 2]
BUILD SUCCESSFUL (total time: 0 seconds)

从输出中可以看到,该get方法始终返回null。原因是我的ValueComparator.compare()方法永不返回0,我通过发表这篇帖子弄清楚了。

有人在那篇文章中建议了以下方法来解决null价值问题:

        public int compare(String a, String b) {
            if (base.get(a) > base.get(b)) {
                return 1;
            }else if(base.get(a) ==  base.get(b)){
                return 0;
            }
            return -1;  
        }

我已经测试了这段代码,它引入了一个关键的合并问题。换句话说,当值相等时,它们的对应键将合并。

我还尝试了以下方法:

            public int compare(String a, String b) {
                if (a.equals(b)) return 0;
                if (base.get(a) >= base.get(b)) {
                    return 1;
                } else return -1;
            }

它也不起作用。一些值仍然是null。此外,该解决方法可能潜在地存在逻辑问题。

任何人都可以为我的问题提出一个完全可行的解决方案?我想同时使用按值排序功能和get方法。


问题答案:

在比较功能中,当值相等时,您应该再比较键。这将确保具有相同值的不同键不会被“合并”,因为它消除了本来比较相等的条目的歧义。

例如:

    @Override
    public int compare(String a, String b) {
        Integer x = base.get(a);
        Integer y = base.get(b);
        if (x.equals(y)) {
            return a.compareTo(b);
        }
        return x.compareTo(y);
    }

(您需要修改上面的代码以匹配空值策略)

请注意,但是,按值排序的方法非常脆弱。您的“已排序”地图将不支持添加新条目,这可能会造成混乱。



 类似资料:
  • 问题内容: 我有ElasticSearch 5,我想根据字段值进行排序。想象一下,具有类别(例如流派)的文档可能具有科幻,戏剧,喜剧等值,并且在进行搜索时,我想对值进行排序,以便首先出现喜剧,然后是科幻和戏剧。然后,我当然会按照其他条件在小组内订购。有人可以指出我该怎么做吗? 问题答案: 使用手动排序进行Elasticsearch排序 在可以根据字段的特定值分配顺序的情况下,这是可能的。 我已经使

  • 问题内容: 如何按名称->值对json文件排序?我想按标签名称的asc值显示。任何想法如何转换我的json文件? 这是我的JSON文件的外观: 如果有人帮助我,我将不胜感激。提前致谢。 问题答案: 我建议使用

  • 问题内容: 我想编写一个比较器,使我可以按值而不是默认自然顺序对TreeMap进行排序。 我尝试过类似的方法,但无法找出问题所在: 我想我要问的是:我可以Map.Entry通过比较器吗? 问题答案: 你不能对值本身进行排序,因为这违反了规范: 一个Map是还提供了一个总体排序它的键。 但是,使用外部集合,你始终可以根据需要按键,值或什至两者的组合(!!)进行排序。 这是一个通用方法,如果的值为,则

  • 问题内容: 我需要运行一个MySQL查询,该查询的顺序由数组值确定。 我的数组是可变的,但数组中的值对应于我的数据库表中名为“ ID”的字段,因此我希望结果以ID顺序9、1、4返回。 这在MySQL中是否可能,还是可以在之后使用数组对MySQL $ result进行排序?您可以假设返回的唯一值是数组中的值。 问题答案: http://dev.mysql.com/doc/refman/5.5/zh-

  • 问题内容: 我需要根据存储在其中的值对我进行排序。在包含存储在手机联系人的名字。 另外,我还要求在对值进行排序时对键进行自动排序,否则你可以说键和值绑定在一起,因此值的任何更改都应反映在键中。 要求的输出: 问题答案: 尝试下面的代码对我来说很好。你可以选择升序和降序 编辑:版本2 使用了新的Java功能,例如流for-each等 如果值相同,则地图将按键排序

  • 问题内容: 它有点难以解释。跳到示例可能会更容易。 一个表有一个ID和四列,每列允许为空。 有x行数。(通常小于4)并且在整个列中最多只能使用4个不同的值。 我希望返回最多4行,其中结果集中的每一行基本上都是一列值,其中该值是从顶部保留Col编号开始从右向左选择的。如果另一行的值不是列唯一,则将其移至下一个可用列。 例子: 如果我有: 我想回来 和 给 和 给 谢谢!当存在非唯一列并且值之间存在空