如何访问ArrayLists的ArrayList? (泛型?)

时间:2012-01-30 18:36:47

标签: java arrays oop generics

我正在尝试创建一个表类,其行和列可以扩展或缩小,以将int和字符串存储为第一个Java项目。我试图用来表示表的数据结构是ArrayLists的ArrayList,其中初始数组的元素都指向一个新的数组列表 - 因此初始数组类型用作行的入口。这将是我在脑海中如何拥有它的图片,供参考:

enter image description here

我遇到的问题是访问内部ArrayLists。我一直在阅读一些文档,我似乎无法理解为什么我无法访问内部列表的大问题。这里有一些代码:

import java.util.ArrayList;

public class Table {

    private int length, width;
    private ArrayList newTable;

    public Table() {
    this.length = this.width = 0;
    }

    /**
     * Testing a few functions
     */
    public static void main(String[] args) {
        // Just testing a few functions.
        Table list1 = new Table();
        list1.createTable(4, 4);
        list1.displayRow(1);
        list1.displayColumn(1);
        System.out.println("displayColumn done!");
        list1.displayEntireTable();
    }

    public void createTable(int tableLength, int tableWidth) {
        length = tableLength;
        width = tableWidth;

        this.newTable = new ArrayList();
        for (int i = 0; i < tableWidth; i++) {
            this.newTable.add(new ArrayList(tableLength));
        }
    }

    public void displayRow(int row) {
        System.out.println(this.newTable.get(row));
    }

    /**
     * This function displays the column of the table. Still work which
     * needs to be done here.
     * @param column 
     */
    public void displayColumn(int column) {
        if (this.newTable.size() >= column) {
            for (int i = 0; i < this.newTable.size(); i++) {
                // This doesn't work.
                System.out.println(this.newTable.get(i).get(column)); 
            }
        }
    }

    public void displayEntireTable() {

        for (int i = 0; i < this.newTable.size(); i++) {
        System.out.println(this.newTable.get(i));
        }
    }
}

我怀疑这个问题可能依赖于泛型中的缺乏使用,我还不像我想的那样熟悉它。所以我的问题,stackoverflow,是否这个数据结构 - ArrayLists的ArrayList - 是否可能,如果是这样,我的问题在哪里?

5 个答案:

答案 0 :(得分:3)

我认为问题在于你误解了new ArrayList(tableLength)调用的语义:它没有创建tableLength元素的数组列表;相反,它会创建一个ArrayList ,初始容量足以容纳至少tableLength个元素

我不确定您计划将哪些元素添加到ArrayLists的ArrayList中,但这里有一种方法可以测试创建二维ArrayList的代码:

for (int i = 0; i < tableWidth; i++) {
    ArrayList toAdd = new ArrayList(tableLength);
    for (int j = 0; j != tableLength ; j++) {
        toAdd.add(new Integer(i*tableLength +j));
    }
    this.newTable.add(toAdd);
}

答案 1 :(得分:2)

当然有可能,我怀疑你的问题 与泛型相关,实际上 - 如果你不使用泛型,你将不得不做一堆演员表,这可能看起来像你好像它不起作用。

我会把它写成像

这样的东西
List<List<Object>> table;

然后我会通过table.add(new ArrayList<Object>())添加行,并使用table.get(i).get(j)访问元素。

答案 2 :(得分:2)

使用Java 1.7泛型改进:

import java.util.ArrayList;
import java.util.List;

public class Table {

    private int length, width;

    private List<List<String>> newTable;

    public Table() {
        this.length = this.width = 0;
    }

    /**
     * Testing a few functions
     */
    public static void main(String[] args) {
        // Just testing a few functions.
        Table list1 = new Table();
        list1.createTable(4, 4);
        list1.displayRow(1);
        System.out.println("displayRow done!");
        list1.displayColumn(1);
        System.out.println("displayColumn done!");
        list1.displayEntireTable();
        System.out.println("displayEntireTable done!");
    }

    public void createTable(int tableLength, int tableWidth) {
        length = tableLength;
        width = tableWidth;

        //by java 1.7 diamond feature, some generics can be hidden
        this.newTable = new ArrayList<>();
        for (int i = 0; i < tableWidth; i++) {
            List<String> columns = new ArrayList<>();
            for (int j = 0; j < tableLength; j++) {
                columns.add(new String("test"));
            } //added here
            this.newTable.add(columns);
        }
    }

    public void displayRow(int row) {
        System.out.println(this.newTable.get(row));
    }

    /**
     * This function displays the column of the table. Still work which
     * needs to be done here.
     * @param column 
     */
    public void displayColumn(int column) {
        for (int i = 0; i < this.newTable.size(); i++) {
            System.out.println("[" + this.newTable.get(i).get(column) + "]");
        }
    }

    public void displayEntireTable() {

        for (int i = 0; i < this.newTable.size(); i++) {
            System.out.println(this.newTable.get(i));
        }
    }
}

答案 3 :(得分:0)

将无效的代码更改为:

System.out.println(((ArrayList) this.newTable.get(i)).get(column)); 

ArrayList中的ArrayList当然可能 禁止你的当然不是泛滥 泛型只是一个编译时检查错误,与它无关。你可以完成遗漏,不建议因为错误造成的阶级演员异常的可能性要大得多。

解释。编译器不知道你的ArrayList包含一个ArrayList,所以它不能识别get方法,因为它试图在Object而不是ArrayList上调用它。所以解决方案就是在没有泛型的情况下使用它。但是我会建议使用泛型并像这样定义你的列表。

private List<List<String> newTable;

注意我是如何使用List而不是ArrayList的。通常,左手赋值包含一个接口,右手包含一个类似ArrayList的具体类。

答案 4 :(得分:0)

首先,你的真正问题是什么?您不会将任何数据添加到内部ArrayLists中,因此它们是空的。

另一方面,最好为行创建一个对象,并将这些对象存储在一个arraylist中。