java - 【算法】HashMap按照value排序
问题描述
阿里面试的时候面试官提出的一个问题:
给定一个HashMap<String, BuziObj> buziObjMap;,其中 BuziObj 实现了Comparable 接口。现在需要将 buziObjMap 按照 BuziObj 有序输出。注意,BuziObj实例有可能相等,要求多次返回的结果一致。可以使用JDK提供的各种API。
当时自己的想法是,将 buziObjMap 的 values 放在一个 List 中。然后使用 Collections.sort(valuesList) 对存放 values 的 valuesList 排序。再遍历排序之后的 valuesList 和 buziObjMap,比对 valuesList 与 buziObjMap 中的值,相等之后,将当前 buziObjMap 中的 Entry 放在 LinkedHashMap 中,返回 LinkedHashMap 即可。
但是如上解法主要存在两个问题:1,不满足多次执行返回结果一致这个要求,因为在遍历 valuesList 与 buziObjMap 时,buziObjMap的输出顺序无法保证每次都是一致的。2,算法的复杂度过大。
针对这个问题,各位同学有什么更好的解法,麻烦提供一下思路。
问题解答
回答1:List<Map.Entry<K, V>> list = new LinkedList<Map.Entry<K, V>>( map.entrySet() ); Collections.sort( list, new Comparator<Map.Entry<K, V>>() { public int compare( Map.Entry<K, V> o1, Map.Entry<K, V> o2 ) { return (o1.getValue()).compareTo( o2.getValue() ); } } ); Map<K, V> result = new LinkedHashMap<K, V>(); for (Map.Entry<K, V> entry : list) { result.put( entry.getKey(), entry.getValue() ); }回答2:
为什么要把Values放到List里呢?直接放Entry不就简单很多了吗。
回答3:路过~路过~路过~路过~路过~路过~路过~路过~路过~
相关文章:
1. objective-c - 从朋友圈跳到我的APP 如何实现?2. java - PHP开发微信无法获取到signature,timestamp,nonce3. 请教一个python字符串处理的问题?4. HTML5禁止img预览该怎么解决?5. 怎么可以实现在手机浏览器看到链接的title属性,就是鼠标放上去会有一个tip效果的6. 如何分别在Windows下用Winform项模板+C#,在MacOSX下用Cocos Application项目模板+Objective-C实现一个制作游戏的空的黑窗口?7. 网页爬虫 - python爬虫用BeautifulSoup爬取<s>元素并写入字典,但某些div下没有这一元素,导致自动写入下一条,如何解决?8. html5 - h5+中webview的show方法有延迟9. javascript - vscode alt+shift+f 格式化js代码,通不过eslint的代码风格检查怎么办。。。10. javascript - html 中select如何修改样式,鼠标悬浮时改变option样式,有没有插件啊
