Agile
A programmer's note
-
A hash set puzzler - [转载]
2007-12-24
周末在家里看到A hash set puzzler ,我想了一下,用反射,但又感觉不靠谱 :(
可天杀的作者一直在卖关子,我这两天时不时的看一下有没有更新,快点公布答案吧。
或者有高手可以告诉我一下,我将非常感.
2007-12-25 更新:
作者给出了一个最好的答案:
final Object[] foo = new Object[]{null};
set.contains(new Object() {
public int hashCode() {
return bar.hashCode();
}
public boolean equals(Object other) {
return bar.equals(foo[0]=other));
}
});
foo[0];
这个办法太棒了,超赞。我的解法也有人用,就是使用反射,作者对这个法子的评价是:
"The next popular variant was to use reflection to call package-protected method on the HashMap holded by the HashSet instance (it would work, but it is not as elegant as above version)."
不够优雅 :(
什么叫Beautiful Code,这就是。 :)
安心睡觉了。
随机文章:
HashMap.get() can cause an infinite loop! 2008-07-06Apache MINA竟然源自Netty2 2008-03-05epoll selector 2008-01-18RMI JDK6比JDK5强的地方 2008-01-03在Linux下重新安装Netbeans6.0 2007-12-23
收藏到:Del.icio.us
在线rss阅读器
Blog:记录成长2007-12-27 21:26:33
引用
下面Blog引用了该文:







评论
list.add(foo);
HashSet<Object> anSet = (HashSet<Object>)set.clone();
anSet.retainAll(list);
Object[] result = new Object[1];
result = anSet.toArray(result);
System.out.println(result[0] + " " + result[0].getClass());
瞎试,反正不用iterate,呵呵,不知道对不对
public boolean retainAll(Collection> c) {
boolean modified = false;
Iterator
while (e.hasNext()) {
if (!c.contains(e.next())) {
e.remove();
modified = true;
}
}
return modified;
}
在这里面还是用了iterator 。
MJiA这招够漂亮,我就没想到,我估计那个作者也是这么想的,超赞 :)
我钻到牛角尖里去了,我想的办法是:
1.通过反射将anSet 中的map属性得到
2.再通过反射调用map.getEntry(Object key),得到一个Map.Entry 对象entry,如果entry不为空的话,那么entry.key就是要找的那个东西了。