数独网格的Java数据类型

时间:2015-01-10 21:22:19

标签: java sudoku

我目前正在尝试用Java计划/编写数独求解器。 我的目标是尽可能多地学习语言(作为初学者)。

解算器不会是一个强大的力量"求解器,但它将是一个实现逻辑算法的函数系统,能够由人完成。

但我使用哪种数据类型?

  • ArrayLists的ArrayList
  • 2D数组
  • 其他东西

我知道在很多情况下,它归结为偏好和功能,但是,因为我希望实现一些"解决"函数,我需要一个2d数据类型,我可以快速有效地迭代,避免重复代码(如嵌套for循环)。

哪种数据类型提供最佳的2D迭代?

3 个答案:

答案 0 :(得分:2)

自从数独网格被修复后,二维数组可能是你最好的选择:

byte[][] grid = new byte[9][9];

它肯定会为您提供最佳的空间和计算性能(即使您在小型9x9网格上没有任何差异!)。

现在,如果您更习惯使用其他数据结构或想要使用更面向对象的数据结构,那就去吧,享受这种语言。

答案 1 :(得分:0)

二维数组可能是最好的解决方案。数组列表数组没有多大意义,因为ArrayLists设计为动态大小,而不是这里的情况。

答案 2 :(得分:0)

我建议根据二维数组编写自己的数据类型。您可以实现类似"迭代"的方法。或者"返回所有细胞"避免重复的嵌套foor循环,仍然访问所有元素。

如果您的字段大小未知或需要动态,无论出于何种原因,ArrayLists都很有用但是因为数独总是有一个你不需要的9x9网格,如果你刚开始学习java,你应该坚持基础知识(在这种情况下包装)围绕2d阵列的一个类,这是一个很好的开始imho)。

还有一点,为什么你应该使用二维阵列:
使用2d数组返回/检查/求解列或行非常容易,因为行和列在数独网格上共享一个公共索引(因此它们在您的2d数组中共享)。

这可能是你开始的一点。只不过是一个小灵感。

class Sudokugrid{
    private int[][] field;
    Sudokugrid(){
       this.field = new int[9][9];
    }
    public int get_cell(int x, int y){
       return this.field[x][y];
    }
    public void set_cell(int x, int y; int value){
       this.field[x][y] = value;
    }
    //(...)
}