作者qrtt1 (null)
站内java
标题Re: [问题] 请问如何实作两个key和一个value的对应 …
时间Thu May 15 15:38:46 2008
※ 引述《Nt1 (用功点吧!)》之铭言:
: 请问一下,假设我有 四笔data,分别是 A, B, C, D,每个data可以两两算距离,
: 例如 AB, AC, AD, BC, BD, CD。
: 我希望有一个资料结构可以把这些距离的关系保存下来,并且可以很快的找到他们,
: 例如:getDistance(A, B),就可以把A和B的距离取出来,请问该怎麽做比较好呢?
: 我目前想到的方法是这样:
: =========================================================================
: class PairCollection{
: ArrayList<Pair> pairs; //all pairs(例如 ab, ac, ad, bc........)
: double getDistance(data a, data b){
: for(Pair p: pairs){ //对全部的 pair 扫描一次
: if(p.contain(a) && p.contain(b)){ //如果pair中有a且b
: return p.getDisntace;
: }
: }
: }
: }
: ---------------------------------------------------------------------------
: class Pair{
: HashSet<data> dataPair; //用hashset来存data
: double distance; //这个pair(例如a和b)的距离
: ......
: }
: ===========================================================================
: 但总觉得不够聪明,每次想取得距离就要全部拿来比对,不知道会不会很慢,
: 不知道有没有什麽比较好的作法,谢谢。
把 Pair 当成1个东西, 并且有覆写 equals hashCode
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.apache.commons.lang.builder.EqualsBuilder;
public class Pair<M, N> {
M m;
N n;
public Pair(M m, N n) {
this.m = m;
this.n = n;
}
@Override
public boolean equals(final Object other) {
if (!(other instanceof Pair))
return false;
Pair castOther = (Pair) other;
return new EqualsBuilder().append(m, castOther.m)
.append(n, castOther.n).isEquals();
}
@Override
public int hashCode() {
return new HashCodeBuilder().append(m).append(n).toHashCode();
}
}
=================================================================
再来就用map噜
Map<Pair, Double> map = new HashMap();
map.put(new Pair(a,b), calculate(a,b));
--
没测过, 也许可以吧XD
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.133.80.216
※ 编辑: qrtt1 来自: 220.133.80.216 (05/15 15:42)
1F:推 TonyQ:q大你人真好(递) 05/15 19:41
2F:推 Earvin:我觉得要考虑到放进map和取value时组key那两个变数 05/15 22:06
3F:→ Earvin:的顺序 , 因为是距离 , 所以Pair(a,b)与Pair(b,a)同样更好 05/15 22:08
4F:→ Earvin:因为a->b的距离应该等於b->a , 这样HashMap可放少点东西 05/15 22:10
5F:→ qrtt1:这样的设计是没错的, 只是在实作上我覆写的equals hashCode 05/15 22:36
6F:→ qrtt1:实作并不符合我的期望, 所以我改成比较简单的实作 05/15 22:36