我正在尝试创建一个表类,其行和列可以扩展或缩小,以将int和字符串存储为第一个Java项目。我试图用来表示表的数据结构是ArrayLists的ArrayList,其中初始数组的元素都指向一个新的数组列表 - 因此初始数组类型用作行的入口。这将是我在脑海中如何拥有它的图片,供参考:
我遇到的问题是访问内部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 - 是否可能,如果是这样,我的问题在哪里?
答案 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中。