0

嗨,我有工作代码,但我想打印出坐标。有一个包含坐标和字符串的哈希图。有一个坐标类可以让我把坐标放进去,但是当我尝试打印出来时,它会变得很困惑,我显然没有做正确的事情。感谢您的关注

public class XYTest {
static class Coords {
    int x;
    int y;

    public boolean equals(Object o) {
        Coords c = (Coords) o;
        return c.x == x && c.y == y;
    }

    public Coords(int x, int y) {
        super();
        this.x = x;
        this.y = y;
    }

    public int hashCode() {
        return new Integer(x + "0" + y);
    }
}

public static void main(String args[]) {

    HashMap<Coords, String> map = new HashMap<Coords, String>();

    map.put(new Coords(65, 72), "Dan");

    map.put(new Coords(68, 78), "Amn");
    map.put(new Coords(675, 89), "Ann");

    System.out.println(map.size());
}
}
4

2 回答 2

3

你必须toString()在你的 Coords 类中覆盖。

static class Coords {
    int x;
    int y;

    public boolean equals(Object o) {
        Coords c = (Coords) o;
        return c.x == x && c.y == y;
    }

    public Coords(int x, int y) {
        super();
        this.x = x;
        this.y = y;
    }

    public int hashCode() {
        return new Integer(x + "0" + y);
    }

    public String toString()
    {
        return x + ";" + y;
    }
}

让你感到困惑的是这样的:

XYTest.Coords@3e25a5

这是什么?这是原始toString()方法的结果。这是它的作用:

return getClass().getName() + '@' + Integer.toHexString(hashCode());

所以,用你自己的代码覆盖它会摆脱令人困惑的输出:)


请注意,您的哈希冲突很大。一个更好的 hashCode() 实现将是:

public int hashCode()
{
    return (x << 16) ^ y;
}

为了证明您的错误哈希码:一些冲突:

  • (0,101) 和 (1,1)
  • (44,120) 和 (44012,0)
于 2012-08-02T19:37:00.083 回答
0

正如 Martijn 所说,覆盖 toString()

class Coords {
....

public String toString(){
   return this.x + "-" + this.y;
 }
....

}

...和

  public static void main(String []args){

……

    map.put(new Coords(65, 72).toString(), "Dan");

……

  }
于 2012-08-02T19:44:23.970 回答