1

这是一个家庭作业问题。我正在为n-QueensJava 中的经典问题编写解决方案。我的程序看起来像这样,但它返回所有合法皇后位置的集合,而不是打印出来。我将皇后的位置表示为int[]Set<int[]>使用HashSet<int[]>它的实现返回。(Set在这里是合适的,因为展示位置的顺序并不重要)。

问题是 Java 数组不会覆盖hashCode,并且具有相同值的不同数组实例具有不同的哈希码。

我可以编写一个包装类QueensPlacements,它包含一个数组并hashCodeArrays.deepHashCode和 return覆盖Set<QueensPlacement>。然而,它似乎冗长而不优雅。有人可以提出更好的解决方案吗?

4

3 回答 3

2

存在几个实现Set接口的标准类。您可以使用 aTreeSet并提供自己的比较器。

于 2010-12-10T10:39:42.170 回答
1

为什么不Set<List<Integer>>呢?

于 2010-12-10T10:56:40.783 回答
1

我可以编写一个包装类QueensPlacements,它包含一个数组并用Arrays.deepHashCode 覆盖hashCode,并返回Set。然而,它似乎冗长而不优雅。

创建自定义类可能不是一个坏主意。听起来您担心您只是在创建一个包装类来传递数据,但是您确定没有其他方法可以提供它可以使其成为解决方案域的完整部分吗?接收放置集的代码用它做什么?有没有放置可以提供的方法来促进接收代码的事情?至少用于调试的好 toString() 方法?

*编辑: *

还要考虑一下,QueensPlacement 可以为Comparator<QueensPlacement>展示位置之间提供一致的排序,这对于概念问题并不是绝对必要的(这对计算机无关紧要),但可能会使 UI 更好一点(例如,它会不会更好对于用户,如果等效的展示位置集以相同的顺序显示)。

于 2010-12-10T11:01:38.023 回答