繁体   English   中英

为2D数组创建hashMap

[英]Creating hashMap for 2d arrays

我正在研究将棋盘状态表示为2d数组的问题。 我需要能够查看是否正在查看当前正在使用的当前板状态。

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

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

我感到自己不太真正理解hashMap,所以我在哪里感到困惑?

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

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

您可以使用数组包装器,该包装器将实现哈希码并等于数组

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); 
    }
}

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

将您的董事会实体包装在名为Board的类中。 覆盖hashCode并等于您要使用的equals方法。 然后使用HashSet。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM