2013-08-21 26 views
0

我想制作一个二维ArrayList,列数已经指定,但不是行。例如,我想首先创建一个有26列和0或1列的表,然后在每个循环做其他事情之后,行数将随着该循环而增加。用指定列数但不是行初始化2D arrayList?

当我增加行数(ArrayList ArrayList的长度)时,我也希望所有26个数组也增加。它的语法是什么?

我该如何索引或将新项目添加到特定位置 - 例如array[2][3] = item

顺便说一句,这是一个DFSA表从NFSA表转换

+1

它不会完全是一个二维列表;这将是一个列表清单。你打算如何处理这种结构?语法并不难,但我很好奇,如果你正在寻找一个可以更优雅地表达的解决方案。 – Makoto

+0

你应该考虑创建一个类来保存26列,并使用包含该类实例的列表。由于可读性问题,列表清单难以维护。 – happymeal

+0

@Makoto即时编写一个字符串数据结构,表示为一个固定列数的表,并且行数将增加,我需要访问所有第一行以便为表上的行添加另一个长度。这是从NFSA转换而来的DFSA表格 – Casper

回答

2

你可以有一个列表的列表,实际上像这样:

List<List<String>> table = new ArrayList<List<String>>(); 

然后添加26列:

for(int i = 0; i < 26; i++) 
{ 
    table.add(new ArrayList<String>()); 
} 

然后,你可以有一种方法,称为addToColumn(int column, String value, List<List<String>> table),你可以这样做:

for(int i = 0; i < table.size(); i++) 
{ 
    if(i == column) 
    { 
     table.get(i).add(value); 
    } 
    else 
    { 
     table.get(i).add(""); 
    } 
} 

这应该让你有一起成长的列表。当然,我在上面的假设是,你将一次输入一个元素。

或者,你可以做一些像这样:

public void addToColumns(Map<int, String> data, List<List<String>> table) 
{ 
    for(int key : data.keyset()) 
    { 
     table.get(key).add(data.get(key)); 
    } 

    for(int i = 0; i < table.size(); i++) 
    { 
     if(!data.containsKey(i)) 
     { 
      table.get(i).add(""); 
     } 
    } 
} 

上述算法应该允许您将项目添加到多列,而空字符串填充休息了。这应该允许你最终得到等长的行。此外,该映射将用于存储键值对,其中键是列号,并且该值将是您想要抛入的任何字符串。这将允许您一次填充表中的一行。

+0

谢谢,我如何访问阵列位置[0] [1]? – Casper

+0

@Herious:'List'接口公开了一个'get(int index)'方法,所以假设你已经填充了你的列表,你可以执行'table.get(0).get(1)'。但请注意,由于您的列表将逐步填充,尝试访问该位置**之前,**实际已经填充任何内容将导致一个'ArrayIndexOutOfBoundsException'。 – npinti

+0

@Herious:你确定你创建了一串字符串列表而不是一串字符串列表吗? – npinti

-1

您可以通过给定唯一的行数创建一个数组:

int[][] array = new int[4][]; 

现在,你可以把你的阵列为您所定义什么转置,所以如果你想进入的第3列的元素你可以输入作为转置,即

array[3][2]=5; 
+0

我觉得你在阅读这个问题有点*太快*,在这里。 – Makoto

+0

@Makoto:我想你并没有在这里读到答案。 –

+0

考虑到有关ArrayLists的问题,并且您正在回答阵列......我会坚持我所说的。 – Makoto