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 に答える