【问题标题】:Check if elements of different ArrayLists share position检查不同 ArrayLists 的元素是否共享位置
【发布时间】:2015-02-21 15:36:19
【问题描述】:

我正在编写一个通过 Java 二维板移动的探针。为此,我有两个 Integer ArrayLists,其中包含探测所遵循的路径。第一个 ArrayList 包含 x 坐标,第二个包含 y 坐标。我想做的是检查运动的下一个瓦片是否已经被访问过,即新的x坐标和新的y坐标是否在对应的ArrayList中并且共享相同的位置。这样,如果新的瓷砖已经被访问过,我不会搬到那里去。我怎么可能这样做?我尝试过使用 indexOflastIndexOf,但它不起作用,因为每个坐标都可以重复无限次。我也试过 .contains 但它也不起作用,因为我需要它包含在特定位置的两个数组中。

任何帮助将不胜感激。

【问题讨论】:

    标签: java arraylist coordinates


    【解决方案1】:

    首先,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();
    

    等等。

    【讨论】:

    • 您的问题的答案是:因为我是 Java 新手,我不知道任何其他方法可以做到这一点。我会尽力理解您的回答并加以应用,谢谢。
    【解决方案2】:

    一种相当混乱的方法是查找匹配 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 坐标列表效率不高(尽管您可以使用 visitedX.indexOf(x)visitedX.lastIndexOf(x) 减少外部 for 循环的限制) .

    【讨论】:

    • 我想我会尝试这种方法,因为它似乎是我问题的完美解决方案,谢谢!而且我知道它根本没有效率,但这是我作为 Java 新手可以理解的唯一方法。
    • 很高兴我能提供一些帮助。虽然它可能不是很优雅或精致,但我希望这种方法更“简单”,并且可能更容易理解:) 祝你的项目好运!
    猜你喜欢
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多