数独网格的Java数据类型

数独网格的Java数据类型,java,sudoku,Java,Sudoku,我目前正试图用Java计划/编写一个数独解算器。 我的目标是尽可能多地学习这门语言(作为初学者) 解算器将不是一个“蛮力”解算器,而是一个实现逻辑算法的函数系统,能够由人工完成 但我应该使用哪种数据类型 ArrayList中的ArrayList 二维阵列 别的 我知道在很多情况下,这取决于偏好和特性,但是,因为我希望实现许多“solve”函数,所以我需要一种二维数据类型,可以快速高效地迭代,避免重复代码(例如嵌套for循环) 哪种数据类型提供了最佳的2D迭代?二维数组可能是您的最佳选择,因为

我目前正试图用Java计划/编写一个数独解算器。 我的目标是尽可能多地学习这门语言(作为初学者)

解算器将不是一个“蛮力”解算器,而是一个实现逻辑算法的函数系统,能够由人工完成

但我应该使用哪种数据类型

  • ArrayList中的ArrayList
  • 二维阵列
  • 别的
我知道在很多情况下,这取决于偏好和特性,但是,因为我希望实现许多“solve”函数,所以我需要一种二维数据类型,可以快速高效地迭代,避免重复代码(例如嵌套for循环)


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

二维数组可能是您的最佳选择,因为数独网格是固定的:

byte[][] grid = new byte[9][9];
它肯定会为您提供最佳的空间和计算性能(即使您在一个小的9x9网格上观察不到任何差异!)


现在,如果您更喜欢使用其他数据结构,或者想要使用更面向对象的数据结构,请尝试使用该语言。

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

我建议您基于2d数组编写自己的数据类型。您可以实现类似“迭代”或“返回所有单元格”的方法,以避免重复的嵌套foor循环,并且仍然可以访问所有元素

如果字段的大小未知或出于任何原因需要动态,那么ArrayList非常有用,但由于数独总是有一个9x9网格,因此您不需要它,如果您刚刚开始学习java,则应坚持基本原则(在本例中,围绕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;
    }
    //(...)
}

如果你想避免嵌套for循环,你可以尝试1D数组。对于数独、tic-tac-toe等游戏,2D数组永远是你最好的选择(更简单)。它在C++中更酷,因为内存块可以被连续分配。