检查不同ArrayLists的元素是否共享位置

时间:2015-02-21 15:36:19

标签: java arraylist coordinates

我正在编写一个在Java中通过2D板移动的探针。为此,我有两个Integer的ArrayLists,它们包含探针遵循的路径。第一个ArrayList包含x坐标,第二个ArrayList包含y坐标。我想要做的是检查是否已经访问了移动的下一个区块,这是新的x-coord和新的y-coord是否在相应的ArrayList中并且共享相同的位置。这样,如果新瓷砖已经访问过,我就不会移动到那里。我怎么可能这样做?我已尝试使用 indexOf lastIndexOf ,但它不起作用,因为每个坐标可以无限次重复。我也尝试了 .contains ,但它没有工作,因为我需要它包含在特定位置的两个数组中。

任何帮助都将不胜感激。

2 个答案:

答案 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

所以给定坐标xy和数组列表visitedXvisitedY你可以这样做:

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))。