Java:二维阵列的arraylists?

时间:2013-08-24 00:04:16

标签: java arrays arraylist

我正在开发一个数独求解程序,我需要一个arraylist,它为9x9板上的每个方块保存数字1到9。这些arraylists中的每一个都对应于该广场可能出现的数字,如果数字不能进入该广场,则会从列表中删除。

我希望能够拉出它正在处理的当前正方形的arraylist,例如,如果我想从对应于square(3,5)的arraylist中删除数字7

arrayOfLists[3][5].remove(Integer.valueOf(7));

然而,我无法弄清楚如何做到这一点。当我尝试创建数组时,我在我声明我的arraylists数组的行上收到此错误

  

无法创建ArrayList的通用数组

这是我的代码:

    //create arraylist
    ArrayList<Integer> nums = new ArrayList<Integer>();

    //fill arraylist with numbers 1-9
    for (int i = 1; i < 10; i++) {
        nums.add(i);
    }

    //create 9x9 array of arraylists
    ArrayList<Integer>[][] array = new ArrayList<Integer>[9][9];

    //fill each element of array with arraylist of numbers 1-9
    for(int i = 0; i<9; i++){
        for(int j = 0; j<9; j++){
            array[i][j] = nums;
        }       
    }

}

我这样做不正确还是无法创建一系列的arraylists?如果不可能,我该怎么办?

5 个答案:

答案 0 :(得分:1)

每当我看到一个列表列表时,闹铃就会响起。你真正想要这种事情的情况确实很少见,而且这不是其中之一。

你有一个由9个固定方块,列和行组成的固定板,每个位置的数字可能是1-9。

对所有这些概念使用数组,因为它们的大小是固定的,您需要直接访问每个元素 - 集合没有任何好处,而且会成为障碍。使用逻辑(可能是设置)来确保每个区域中只使用一次数字。

答案 1 :(得分:1)

使用位字段而不是数组列表。也就是说,使用整数,其中位1-9表示数字的可能性。测试,添加,删除单个数字是O(1),并且它具有固定的内存大小。将整数封装在知道操作的对象中。

答案 2 :(得分:0)

一些事情:

1)在for循环中,array [i] [j] = nums;这将导致数组的每个元素中的相同对象。如果在数组的一个元素上调用remove(),它将影响所有其他元素。您想为每个元素构建一个单独的列表对象。

2)接口程序;将nums声明为List而不是ArrayList。

3)使用列表列表而不是任何列表数组。

    List<List<List<Integer>>> list = new ArrayList<List<List<Integer>>>();
    for(int i = 0; i<9; i++){
        List<List<Integer>> row = new ArrayList<List<Integer>>();
        for(int j = 0; j<9; j++){
            List<Integer> nums = new ArrayList<Integer>();
            for (int k = 1; k < 10; k++) {
                nums.add(i);
            }
            row.add(nums);
        }
        list.add(row);
    }

    // You can still get an element by index
    int x = list.get(3).get(1).remove(6);

但这有点笨拙。您可能想要考虑编写一个代表董事会的类。这样你至少会有更好的抽象操作。

答案 3 :(得分:0)

您可以完全删除使用2d内容并保留单个列表,方法是为每个方块提供1 ... 81中的唯一编号。因此,如果您正在使用3,5单元格,这意味着它是列表中的9 * 2 + 5 = 23项。这将大大简化列表操作。在给定(3,5)类型的引用

的情况下,您可以使用单个方法来给出唯一的单元格索引

答案 4 :(得分:-1)

好的,我会发布这个作为答案,因为它似乎对我有用,我还没有看到任何陷阱。

private static class IntegerArrayList extends ArrayList<Integer> {
    IntegerArrayList () { super(); }
    IntegerArrayList (Collection<? extends Integer> c) { super(c); }
    IntegerArrayList (int initialCapacity) { super(initialCapacity); }
}

现在你可以说像

IntegerArrayList[][] array = new IntegerArrayList[9][9];

和array [1] [2]之类的元素将继承所有的ArrayList方法(array[1][2].remove(something)工作正常)。我让班级private static认为你可以将它嵌套在其他课程中,如果这是你唯一可以使用它的地方,但如果你愿意的话,你可以把它公之于众。另外,我从ArrayList复制了所有三个构造函数;你可以消除不需要的但我没有看到令人信服的理由。

我认为问题是new ArrayList<Integer>[9][9]被禁止,因为它会创建一个不进行类型检查的数组(因为“类型擦除”)。但我认为添加继承自ArrayList<Integer>的非泛型类型可以恢复类型安全性。

但我不是一名通用专家,如果有人比我更了解这个解决方案的问题,我也不会感到惊讶。但它似乎对我来说很好,没有关于未经检查的类型的东西或任何东西的编译器警告。

(PS我发布这个作为一个可能被问到很多问题的一般解决方案。但实际上,对于这个特殊问题,我可能只使用一个固定大小的布尔数组而不是一个ArrayList,比如其他人,或者如果速度是一个真正的问题,我甚至可能会对整数做一点努力。)