2013-10-26 105 views
1

我循环到一些行,并试图过滤这些行与一些if语句。在每个if语句中,我需要为多个元素建立一个索引。我可以使用2d String [] []来完成,但问题是我不知道在这个阶段每行的大小是多少。二维数组,但与索引 - java

我期待像存储以下我的数据:

0  1 3 4 5 6 7 etc.. 
0 str str str str str str str 
1 str str str 
2 
3 str str str str str str 

任何建议将不胜感激

Edit: 

很抱歉,如果我的问题不明确。但我会在这里解释一下。

我的循环看起来像这样:

newArrayList 
for (i; i < List ;i++) 
{ 
    if(...) 
    { 
    newArrayList.add.(0, List.get(i)); 
    } else if(...) 
    { 
    newArrayList.add.(2, List.get(i)); 
    } else if(...) 
    { 
    newArrayList.add.(6, List.get(i)); 
    } 
} 

上面的代码不工作,但我只是想解释什么,我需要做的其实!我的if语句可能会出现好几次,我想为每个if语句的期望值和一组字符串考虑一个索引。谢谢。

+0

Couldn't您使用的'数组添加元素列表'? –

+0

@StefanFreitag我可以使用它,如果我不需要索引元素。由于我不知道如果声明会发生,我需要对每个列表进行索引(硬编码)作为参考。 – iAziz

+0

我很困惑。什么是“索引”?行号或列号? –

回答

1

如果你的指数是连续的形式0到n和你在一个顺序插入它们,但N的预先不知道:有两个经典的解决方案:

1)如果用一个预先分配的固定做阵列,你显然需要两遍。第一遍是扫描行并计算元素。第二遍是创建索引。

2)你可以用一个集合,实现动态增长通过。新增(项目)方法做到这一点,像列表

如果将集合转换成固定大小的数组后,那么它也许是更快使用方法1),因为由于内存管理/分配/重新分配,add方法可能会变慢。

如果你的指数是连续的形式0到n和n预先知道,但你不插入元素的顺序:

您应在1以上)使用的解决方案。

如果你的指数是不连续,N已知预先知道:

3)您创建一个Map<Integer,String> strings,并通过strings.put(index, string)中添加元素(按任何顺序)。

如果你的索引不是唯一的(因为我们终于找到了):

4)你一个箱子和Map<Integer,ArrayList<String>> stringMap通过

addStringForIndex(String string, Integer index) 
{ 
    listForString = stringMap.get(index); 
    if(listForString == null) { 
     listForString = new ArrayList<String>; 
     map.put(index, listForString); 
    } 
    listForString.add(string); 
} 
+0

解决方案应该是第二种,但不知道如何去做?列表不适用于我。看我的编辑。 – iAziz

+0

我相信你必须让你的问题更清楚。您的索引从0到n不是连续的。那是你的问题。对?在这种情况下,你需要一张地图。另外:你的钥匙,索引或字符串是什么?如果你想获得给定字符串的索引,那么地图是相反的。也许你必须更精确地提出这个问题 –

+0

我试图尽可能多地解释。我的索引可能是一个从0开始的已知数字,但对于每个索引,我需要有一个未知数量的元素,因为一次可以插入一个元素。另外,第一个元素可以存储在例如索引5处。 – iAziz

2

你可以尝试一个“s ArrayListArrayList

ArrayList<ArrayList<String>> strings = new ArrayList<ArrayList<String>>(); 
    strings.add(new ArrayList<String>()); // Adding a first array to the 'array of arrays' 
    strings.get(0).add("String1"); // Add a string to the first array, 
            // Similar to: arr[0][0] = "String1" 

    //To access them element by element use a double for, note that "s" is each element 
    for (ArrayList<String> l : strings) { 
     for (String s : l) { 

     } 
    } 

PS:一个ArrayList<Object>就像是一个数组Object[]但更灵活。它有一些有用的方法,如:

arr_list.get(index); // Getting an object in position 'index' 
arr_list.add(object); // Adding an element (Similar to assignment in arrays) 

编辑

如果你知道“行”,那么你必须将它们添加到array of arrays的数量。有了这个for你“创建阵列的空行”:

Rows: 
    0 
    1 
    ... 
    n 


for (int i = 0; i < n; i++) { // n is the number of "rows" 
    strings.add(new ArrayList<String>()); 
} 

然后将元素添加到“行”:

strings.get(0).add("String1"); // get(0) to obtain the first row, get(1) to obtain the second... 
+0

我会尽快回复。谢谢。 – iAziz

+0

只有当我添加一个元素,但如果我做了类似以下的操作时,它才会有效:'IndexOutOfBoundsExpection': '\t strings.get(0).add(“String1”); \t strings.get(2).add(“String2”); \t strings.get(3).add(“String3”); \t strings.get(3).add(“String4”); ' – iAziz

+0

你说你知道行数,所以首先添加'n'数组到'array数组'。见编辑 – Christian

0

如果你不知道你的数组的大小,你可以使用一个List实现,例如:

ArrayList<ArrayList<String>> 2D = new ArrayList<ArrayList<String>>(); 

,然后使用for-each循环

+0

当我使用'add(int index,E element)'方法时,它不起作用。 – iAziz