【问题标题】:Creating hashMap for 2d arrays为二维数组创建 hashMap
【发布时间】:2014-04-15 09:35:22
【问题描述】:

我正在解决一个问题,我将棋盘状态表示为 2d 数组。 我需要能够查看我正在使用的当前董事会状态是否以前曾见过。

我曾想过使用一个 HashMap 对象,该对象将二维数组作为参数,然后创建其唯一的哈希值。然后我可以通过使用 HashMap 的“.contains()”方法查看 HashMap 对象是否包含我当前正在使用的板状态。

我感到困惑的是 HashMap 对象采用“键”和“值”参数。 我只需要一个简单地将二维数组作为参数并创建其唯一哈希值的对象,然后允许我使用“.contains()”和“.put()”方法。

我感觉自己并没有真正理解 hashMaps,所以我在哪里感到困惑?

【问题讨论】:

    标签: java arrays hashmap


    【解决方案1】:

    听起来您需要Set,而不是Map。正如您所说,Map 是一个键值结构。由于您只需要存储值(哈希码),因此您只需要 Set。要快速查找,HashSet 可能是您的最佳选择。

    只需计算每个状态的哈希码,检查它是否存在于你的HashSet,否则添加它。

    【讨论】:

      【解决方案2】:

      您可以使用数组包装器来实现数组的哈希码和等于

      class ArrayHolder {
          int[][] a;
      
          public ArrayHolder(int[][] a) {
              this.a = a;
          }
      
          public boolean equals(Object obj) {
              if (!(obj instanceof ArrayHolder)) {
                  return false;
              }
              return Arrays.deepEquals(a, ((ArrayHolder)obj).a);
          }
      
          public int hashCode() {
              return Arrays.deepHashCode(a); 
          }
      }
      

      【讨论】:

        【解决方案3】:

        首先,您不需要 2D 数组,使用单个 1D 数组可以将所有信息放在同一个位置,以一种非常简单的方式,不那么复杂。为什么不使用字符串来存储您的棋盘状态而只使用字符串数组来存储所有棋盘状态? 我认为不使用 Set 很重要,因为您可以重复您的棋盘状态,例如,如果两个玩家都重复动作。 如果你不需要存储重复的棋盘状态,你可以使用 Set 和 set.add 方法,它会告诉你 String 是否已经在 Set 中。

        【讨论】:

          【解决方案4】:

          将您的电路板实体包装在名为 Board 的类中。覆盖 hashCode 和 equals 方法以在您的情况下工作。那就用HashSet吧。

          建议:可能不是最快的,但绝对是最简单的编写 equals/hashCode 的方法是将您的板转换为 String 并将工作委托给 String 方法。 (在您最喜欢的 IDE 中自动生成也可以)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-12-27
            • 2011-10-19
            • 1970-01-01
            • 2016-08-03
            • 2013-02-22
            • 2011-08-14
            • 2012-03-23
            相关资源
            最近更新 更多