这是一个家庭作业问题。我正在用Java写一个经典n-Queens问题的解决方案。我的程序看起来像this,但它返回了所有合法女王位置的集合,而不是将它们打印出来。我将queens的位置表示为int[],并使用HashSet<int[]>作为其实现来返回Set<int[]>。(Set在这里是合适的,因为放置的顺序并不重要)。
问题是Java数组不会覆盖hashCode,并且具有相同值的不同数组实例具有不同的哈希码。
我可以编写一个包装类QueensPlacements,它包含一个数组并用Arrays.deepHashCode覆盖hashCode,然后返回Set<QueensPlacement>。然而,它看起来既冗长又不雅。有没有人能提出更好的解决方案?
发布于 2010-12-10 18:39:42
有几个实现Set接口的标准类。您可以使用TreeSet并提供自己的比较器。
发布于 2010-12-10 18:56:41
为什么不使用Set<List<Integer>>?
发布于 2010-12-10 19:01:38
我可以编写一个包装类QueensPlacements,它包含一个数组并用Arrays.deepHashCode覆盖hashCode,然后返回Set。然而,它看起来既冗长又不雅。
创建自定义类可能不是一个坏主意。这听起来像是您担心您只是在创建一个仅传递数据的包装器类,但是您确定它没有其他方法可以使其成为解决方案域的完整部分吗?接收放置集的代码用它做什么?放置是否可以提供一些方法来简化接收代码的工作?一个很好的toString()方法,至少可以进行调试?
*编辑:*
还要考虑到,QueensPlacement可以为位置之间的一致排序提供Comparator<QueensPlacement>,这对于概念问题来说并不是严格必要的(对计算机来说并不重要),但可能会使UI更好一些(例如,如果相同的位置集以相同的顺序显示,对用户来说不是更好吗)。
https://stackoverflow.com/questions/4407916
复制相似问题