已知一对象,和定义为Vector的一个矢量集合, 问Vector类中有没有函数可返回与已知对象相同的对象.
例如:
Vector npoints=new Vector();
class point{
    int x;int y;
}
point p=new point();
npoints.addElement(p);
.....
//假设npoints已经存了很多的point的
//已知新对象
poinst p1=new point();p1.x=1;p2.x=1
//现在我要检测p1是否存在于npoints中,若存在则获取npoints该对象的x值,并做如
//下判断
if (npoints.contains(p1) && p1.x=1)
                             ~~~~~~
//这里将出错,因为p1是个新对象,而不是points里的对象,判断无效
//那么我应该怎么写?请教,谢谢

解决方案 »

  1.   

    override point's equals and hashCode method.
      

  2.   

    把你的point改成这样:
    <<
    class point {
        int x;
        int y;    public boolean equals(Object o) {
            if(this==o) return true;
            if(!(o instanceof point)) return false;
            point that = (point)o;
            return x==that.x && y==that.y;
        }    public int hashCode() {
            int result = 17;
            result = 37 * x + result;
            result = 37 * y + result;
            return result;
        }
    }
    >>
      

  3.   

    土了 没看懂
    抱歉 刚学java,两位高手能否说得详细些重载这两个方法有什么用呢?判断p1是否存在于npoints中
    是否可以用npoints.contains(p1)这个方法?还有后面的判断npoints与p1相同的那个对象的值=1,该如何写呢?....
      

  4.   

    equals 和hashcode方法必须要覆写
      

  5.   

    <<重载这两个方法有什么用呢?>>
    比较两个对象是否相等(通常是逻辑相等)。<<判断p1是否存在于npoints中>>
    <<是否可以用npoints.contains(p1)这个方法?>>
    可以。<<还有后面的判断npoints与p1相同的那个对象的值=1,该如何写呢?>>
    你的问题就没有问清楚,而且p1,p2乱七八糟的一堆,p2都不知道如何冒出来的,不知所云。
      

  6.   

    楼上的牛人都说了.重载那两个方法的目的就是为了让vector可以对所包含的对象进行比较.如果你没有equas方法,那么vector就没法比较所包含的对象,也就根本不可能知道你新加的是否已经在vector有了... 任何一个class里都有equas方法,你不重载,默认的是比较地址,你的所有point肯定地址不一样,所以肯定就不相等,所以要自己定义自己的equas方法...
    至于equas和hashcode的具体意义和应用,自己看书吧...
      

  7.   

    另外,vector是老版本里的,现在有List来代替,特别ArrayList来代替Vector .
      

  8.   

    p2.x=1是笔误 应该是p1.y=1;因为不知怎么修改帖子,所以没改 见谅我的意思是在npoints这个类中找到这么一个对象p(p.x=1)与p1.x相等,注意我只需要判断其p.x值,p.x值相等,即相等,无需判断p.y值如果找到即表示存在,我用的是npoints.containts(p1),现在看看,这样判断肯定是不行的,我现在没有想到更好的方法存在的同时,我还需要判断,是否这个p.y=1,如果等于1,进行下一步操作,因为我现在只有p1的值,不知道怎么获取npoints中对象p的值来判断p.y是否等于1.所以这里不知道改怎么写叙述的不清楚之处,还请多多包涵
    //bow
      

  9.   

    point p1 = new point();
    p1.x = 1; 
    p1.y = 1;List results = new ArrayList();
    for( Iterator it=npoints.iterator(); it.hasNext(); ) {
        point each = (point)it.next();
        if ( each.x == p1.x ) {
            results.add(each);
        }
    }point[] points = (point)results.toArray(new point[0]);
      

  10.   

    调用npoints.containts(p1)的时候,实际上vector内部进行的处理是进行一个遍历,将vector中的每个元素都拿来作.equals(pl)这个操作,如果没有自己重载equals的话,会调用基类Object的equals来作比较,显然这并不是你想要的结果,所以你要自己写equals方法,实现自己的比较方式,其实这里你是放在vector里的,可以不用重载hashcode方法,因为hashcode通常只在hash表的时候才会用到.
      

  11.   

    调用e.contains(Object o)方法时,进行o==null ? e==null : o.equals(e)判断。o != null 时调用存储对象的equals()方法,你可以重写这个方法,不过你要看一下API中返回true的判断方法。在这里你重写Point类的euquals()和hashCode()方法。要么就在外面遍历一下,不用contains()方法。