我有这个类来保存两个值:
public class Coord {
public int x;
public int y;
public Coord(int x, int y) {
this.x = x;
this.y = y;
}
}
我试图在深度优先搜索算法中使用它:
x = this.move_to_x;
y = this.move_to_y;
Coord stack = new Coord(0, 0);
Stack<Coord> start = new Stack<Coord>();
Stack<Coord> visited = new Stack<Coord>();
start.push(stack);
visited.push(stack);
while (!start.empty()) {
Coord tmp = (Coord)start.pop();
int j,k;
j = tmp.x;
k = tmp.y;
// there is only 8 possible ways to go (the neighbors)
for (int a = -1; a < 2; a++) {
tmp.x = j + a;
for (int b = -1; b < 2; b++) {
if (a == 0 && b == 0) {
continue;
}
tmp.y = k + b;
if (tmp.x < 0 || tmp.y < 0) {
continue;
}
if (tmp.x > 5 || tmp.y > 5) {
continue;
}
if (tmp.x == x && tmp.y == y) {
System.out.println("end!");
return;
}
Coord push = new Coord(tmp.x, tmp.y);
System.out.println("visited: " + visited);
if (visited.search(push) == -1) {
System.out.println("added x " + push.x + " y " + push.y
+ " " + visited.search(push));
start.push(push);
visited.push(push);
} else {
System.out.println("visited x " + tmp.x + " y " + tmp.y
+ " index " + visited.search(push));
}
}
}
}
问题是visited.search
方法总是返回-1
。这是日志:
visited: [Agent.ExampleAgent.Coord@1af6a711]
added x 0 y 1 -1
visited: [Agent.ExampleAgent.Coord@1af6a711, Agent.ExampleAgent.Coord@1c727896]
added x 1 y 0 -1
visited: [Agent.ExampleAgent.Coord@1af6a711, Agent.ExampleAgent.Coord@1c727896, Agent.ExampleAgent.Coord@5fbd8c6e]
added x 1 y 1 -1
visited: [Agent.ExampleAgent.Coord@1af6a711, Agent.ExampleAgent.Coord@1c727896, Agent.ExampleAgent.Coord@5fbd8c6e, Agent.ExampleAgent.Coord@427a8ba4]
added x 0 y 0 -1
visited: [Agent.ExampleAgent.Coord@1af6a711, Agent.ExampleAgent.Coord@1c727896, Agent.ExampleAgent.Coord@5fbd8c6e, Agent.ExampleAgent.Coord@427a8ba4, Agent.ExampleAgent.Coord@262f6be5]
added x 0 y 1 -1
visited: [Agent.ExampleAgent.Coord@1af6a711, Agent.ExampleAgent.Coord@1c727896, Agent.ExampleAgent.Coord@5fbd8c6e, Agent.ExampleAgent.Coord@427a8ba4, Agent.ExampleAgent.Coord@262f6be5, Agent.ExampleAgent.Coord@199d4a86]
请注意,添加到访问堆栈的第一个元素是(0,1)
,但是当搜索(0,1)
时,该方法会返回-1
。
答案 0 :(得分:1)
如果参数的x和y等于对象的x和y值,则需要覆盖equals()
方法,使其返回true
。
您还应该覆盖hashCode()
方法,以便它与equals()
方法“一致”。
答案 1 :(得分:1)
(想象一下,我发布了一个回答,概述了我们在聊天讨论中取得的进展)
假设Coord
类的以下状态:
public class Coord {
public int x;
public int y;
public Coord(int x, int y) {
this.x = x;
this.y = y;
}
@Override
public boolean equals(Object obj){
if (obj == null)
return false;
if (obj.getClass() != Coord.class)
return false;
if (obj == this)
return true;
Coord a = (Coord)obj;
return (a.x == this.x && a.y == this.y);
}
@Override
public int hashCode() {
return x*17 + y*31;
}
@Override
public String toString() {
return "("+x+", "+y+")";
}
}
......实施:
equals()
因为这是堆栈搜索使用的,根据其Javadoc hashCode()
作为最佳做法,随附equals()
toString()
以获得更清晰的诊断输出这个想法是与其他代码隔离开来测试堆栈搜索的功能。如果我们能够证明堆栈搜索功能正常,那么问题出在其他地方。
证明堆栈搜索可以使用测试类完成,例如:
public class CoordTest {
public static void main(String[] args) {
System.out.println("Running tests...");
System.out.println("Testing: equals");
Coord c1a = new Coord(2,3);
Coord c1b = new Coord(2,3);
check(c1a.equals(c1b));
System.out.println("Testing: not equals");
Coord c2a = new Coord(2,3);
Coord c2b = new Coord(6,8);
Coord c2c = new Coord(2,8);
Coord c2d = new Coord(6,3);
check(!c2a.equals(c2b));
check(!c2a.equals(c2c));
check(!c2a.equals(c2d));
System.out.println("Testing: not found in empty stack");
Stack<Coord> stack1 = new Stack<Coord>();
int result1 = stack1.search(c1a);
check(result1 == -1);
System.out.println("Testing: not found in non-empty stack");
Stack<Coord> stack2 = new Stack<Coord>();
stack2.push(new Coord(4,5));
stack2.push(new Coord(6,7));
int result2 = stack2.search(c1a);
check(result2 == -1);
System.out.println("Testing: found in non-empty stack");
Stack<Coord> stack3 = new Stack<Coord>();
stack3.push(new Coord(4,5));
stack3.push(new Coord(3,1));
stack3.push(new Coord(6,7));
int result3 = stack3.search(new Coord(3,1));
check(result3 == 2);
System.out.println("All tests completed successfully.");
}
private static void check(boolean condition) {
if (!condition) {
throw new RuntimeException("Condition failed!");
}
}
}
输出:
Running tests...
Testing: equals
Testing: not equals
Testing: not found in empty stack
Testing: not found in non-empty stack
Testing: found in non-empty stack
All tests completed successfully.