我正在编写一个在Java中通过2D板移动的探针。为此,我有两个Integer的ArrayLists,它们包含探针遵循的路径。第一个ArrayList包含x坐标,第二个ArrayList包含y坐标。我想要做的是检查是否已经访问了移动的下一个区块,这是新的x-coord和新的y-coord是否在相应的ArrayList中并且共享相同的位置。这样,如果新瓷砖已经访问过,我就不会移动到那里。我怎么可能这样做?我已尝试使用 indexOf 和 lastIndexOf ,但它不起作用,因为每个坐标可以无限次重复。我也尝试了 .contains ,但它没有工作,因为我需要它包含在特定位置的两个数组中。
任何帮助都将不胜感激。
答案 0 :(得分:2)
首先,Java是面向对象的,因此您应该使用对象。为什么要将坐标存储在两个单独的数组中?
您可以定义自己的类型:
class Position implements Comparable<Position> {
public final int x;
public final int y;
Position(int x, int y) { this.x = x; this.y; }
@Override public int compareTo(Position other) { ... }
@Override public boolean equals(Object other) { ... }
@Override public int hashCode() { ... }
}
然后用这个你可以做任何你想做的事,例如
Set<Position> visited = new HashSet<Position>();
Map<Position, Integer> visitedWithSpecificPositionInPath = new HashMap<Position, Integer();
等等。
答案 1 :(得分:0)
一个非常混乱的方法是找到匹配x坐标的所有索引,并且对于找到的每个索引,检查给定索引的y坐标是否等于所讨论的y
。
所以给定坐标x
,y
和数组列表visitedX
和visitedY
你可以这样做:
public static boolean isVisited(int x, int y){
for(int i = 0; i < visitedX.size(), i++){
if(visitedX.get(i) == x){
if(visitedY.get(i) == y){
return true;
}
}
}
return false;
}
但正如杰克提到的那样,你应该重新考虑你的数据结构,因为在整个x坐标列表上循环不是很有效(尽管你可以使用for
来减少外部visitedX.indexOf(x)
循环的限制, visitedX.lastIndexOf(x)
)。