作者superlubu (叔叔你人真好)
看板java
标题Re: [问题] HashMap的问题
时间Wed Nov 21 09:45:48 2007
※ 引述《TonyQ (骨头)》之铭言:
: 与其要写HashMap然後再另外对EntrySet写Comparator做排序
: 倒不如用 TreeMap (差别只有implements SortedMap) 搭配Comparator
: 效能上会好一点(特别是取多次的时候每次取都要sort一次 ,蛮糟的)
: TreeMap(Comparator<? super K> c)
: Constructs a new, empty map, sorted according to the given
: comparator.
基於和平、爱与正义,昨晚在工作到快要秀逗时拿了这个问题来想了一下,
其实是还可以活用 Tree + HashMap 来达成要求的
不过 HashMap 不能拿来直接用.
public Class HashMapWithTreeSet<K extends Comparable,V extends Comparable>
extends HashMap
{
private TreeMap<K> sortedKeys = new TreeMap<K>();
public HashMapWithTreeSet() {
super();
sortedKeys = new TreeMap<K>(new internalComparator<K>(this));
}
.......
class internalComparator<K extends Comparable> implements Comparator<K> {
HashMapWithTreeSet<K, ? extends Comparable> hash = null;
public internalComparator(HashMapWithTreeSet<K,
? extends Comparable> hash) {
this.hash = hash;
}
public int compare(K k1, K k2) {
Object v1 = hash.get(k1), v2 = hash.get(k2);
if (v1 == null && v2 == null) return 0;
if (v1 == null) return -1;
if (v2 == null) return 1;
int result = hash.get(k1).compareTo(hash.get(k2));
if (result == 0) return k1.compareTo(k2);
return result;
}
}
}
大家应该就知道我想要干什麽了吧... 嘿嘿嘿... 嘿嘿...
接下来只要 override HashMap 的 put, remove,以及 keySet 就达成目标了 XD
这... 算是旁门左道吧 囧rz
(Ver 1.1 : 改了一下 comparator, 不然在 add 时出现问题...)
(Ver 1.2 : 工作中间再偷懒测试......)
把两个方法做一下测试...
方法 A : HashMapWithTreeSet
方法 B : 整个 entrySet 抽出用 Collections.sort
1) HashMap 为 HashMap<Integer, String>
2) 准备 1000 个不同长度的 String
3) Randomly 决定 Key
4) Randomly 从 1000 个 String 中抽出一个当 Value
5) Randomly 决定是 put 还是 remove, 把 <key,value> 放入
6) 重覆 (3) - (5) n 次
然後那个把整个 Entry set 抽出来 sort 的方法,每个测试在 (3) - (5)
之间平均重覆 15 次
结果是 A 大胜...
抽插次数 n 超过四万次之後,A 就永远都比 B 要快了....
你非得用这麽猥亵的字眼不行吗 <(# ̄皿 ̄)╮☆(__ __||)
而且要注意的是,A 的那个方法是任何时候抽出来的 keySet 都是 sorted 的,
而不像 B 只有十五次...
当然若是真的只需要在最後结果有 sorted,那还是用整个抽出来 sort 的方法比较快
[... 唉我怎麽放着工作不做,在这里搞些有的没的呢...]
(Ver 1.3 : 哈哈哈,我真无聊)
刚刚想到,如果把 Set<Map.Entry> 转成 Map.Entry[] 再用 Arrays.sort 会不会
快一点
真的会 @_@
HashMap hm = new HashMap<Integer, String>;
......
Comparator ec = new Comparator<Map.Entry>() { ...... }
Set<Map.Entry> s = hm.entrySet();
Map.Entry[] me = new Map.Entry[s.size()];
s.toArray(me);
Arrays.sort(me, ec);
不过也只能撑到抽插次数十万左右 (喂!)
Sorting 次数仍维持 15 次
--
《为了要得到真相,就要向原 PO 伸图》
那就是伸图魔人的没图没真相原则,那时我们坚信那就是逼逼死的真实
靠么,图咧?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 147.8.130.225
※ 编辑: superlubu 来自: 147.8.130.225 (11/21 10:07)
※ 编辑: superlubu 来自: 147.8.130.225 (11/21 10:11)
※ 编辑: superlubu 来自: 147.8.130.225 (11/21 15:19)
※ 编辑: superlubu 来自: 147.8.130.225 (11/21 15:25)
1F:推 kians:谢罗 11/25 14:46