阿里面试的时候面试官提出的一个问题:
给定一个
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,算法的复杂度过大。
针对这个问题,各位同学有什么更好的解法,麻烦提供一下思路。
黄舟2017-04-18 10:54:16
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() );
}
PHP中文网2017-04-18 10:54:16
Why should we put Values in List? Wouldn't it be much simpler to put Entry directly?
天蓬老师2017-04-18 10:54:16
Passing by~Passing by~Passing by~Passing by~Passing by~Passing by~Passing by~Passing by~Passing by~