加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

Java Map按值排序

发布时间:2020-12-14 05:06:34 所属栏目:Java 来源:网络整理
导读:我正在寻找排序Map String,Integer的方法.按值.我发现了 this post,它解决了我的排序问题,但并不完全.根据帖子,我写了以下代码: import java.util.*;public class Sort { static class ValueComparator implements ComparatorString { MapString,Integer ba
我正在寻找排序Map< String,Integer>的方法.按值.我发现了 this post,它解决了我的排序问题,但并不完全.根据帖子,我写了以下代码:
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,我已经通过制作了this post.

有人建议在那篇文章中,以下解决空值问题:

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;
            }

它也不工作.一些值仍为空.此外,此解决方法可能存在逻辑问题.

任何人都可以为我的问题提出一个全面的解决方案?我希望通过value函数进行排序,并且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);
    }

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

请注意,您对价值观排序的方法相当脆弱.您的“排序”地图将不会支持添加新的条目,这可能会令人困惑.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读