2D数组,但带有索引-java

2D数组,但带有索引-java,java,arrays,string,2d,Java,Arrays,String,2d,我将循环成许多行,并尝试使用一些if语句过滤这些行。在每个if语句中,我需要为许多元素建立索引。我本可以使用2d字符串[]来实现这一点,但问题是我不知道在这个阶段每行的大小 我希望按如下方式存储我的数据: 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 如有任何

我将循环成许多行,并尝试使用一些if语句过滤这些行。在每个if语句中,我需要为许多元素建立索引。我本可以使用2d字符串[]来实现这一点,但问题是我不知道在这个阶段每行的大小

我希望按如下方式存储我的数据:

    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));
  }
 }
newArrayList
对于(i;i

上面的代码不起作用,但我只是想解释一下我到底需要做什么!我的IF语句可以多次出现,我想考虑每个if语句期望加上一组字符串的索引。谢谢

您可以尝试
ArrayList
ArrayList

    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) {

        }
    }
编辑

如果知道“行”的数量,则必须将它们添加到数组的
数组中。使用此
for
可以“创建数组的空行”:


如果不知道数组的大小,可以使用列表实现,例如:

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

然后,如果索引是从0到n的连续形式,并按顺序插入,但n事先未知,则对每个循环使用a:

有两个经典解决方案:

1) 如果使用预先分配的固定数组执行此操作,显然需要两次传递。第一步是扫描行并计数元素。第二步是创建索引

2) 您可以使用允许通过.add(item)方法(如List)动态增长的集合来实现这一点

如果稍后将集合转换为固定大小的数组,则使用方法1)可能会更快,因为由于内存管理/分配/重新分配,add方法可能会更慢


如果您的索引是从0到n的连续形式,并且n是预先知道的,但是您插入的元素不是按该顺序插入的:

您应该使用上面的解决方案1)

如果您的索引不是连续的,并且n是预先知道的:

3) 创建
映射字符串
,并通过
strings.put(index,string)
(按任意顺序)添加元素

如果您的索引不是唯一的(我们最终发现):

4) 您可以装箱一个
映射stringMap
,并通过

addStringForIndex(String string, Integer index)
{
    listForString = stringMap.get(index);
    if(listForString == null) {
        listForString = new ArrayList<String>;
        map.put(index, listForString);
    }
    listForString.add(string);
}
addStringForIndex(字符串,整数索引)
{
listForString=stringMap.get(索引);
if(listForString==null){
listForString=新的ArrayList;
map.put(索引,listForString);
}
添加(字符串);
}

你不能使用一个
列表`?的数组吗?@StefanFreitag如果我不需要索引元素,我可以使用它。因为我不知道if语句会发生什么,所以我需要有某种索引(硬编码)作为每个列表的参考。那个“索引”是什么?行数还是列数?我试试这个,很快回来。谢谢。这仅在我添加一个元素时有效,但如果我执行以下操作,它会抛出
索引outofboundsexpection
:`strings.get(0.add(“String1”);获取(2)。添加(“String2”);获取(3)。添加(“String3”);获取(3)。添加(“String4”)`您说过您知道行数,所以首先将
n
数组添加到
数组中。我想我明白了。您有机会知道最多需要多少行,因此您希望在一定数量的行(未知)中存储一定数量的元素(未知)。在你的第一个
for
中,你在循环什么?在数组数组上?当我使用'add(int index,E element)`方法时,它对我不起作用。解决方案应该是第二种,但不确定如何做?这个清单对我不适用。请看我的编辑。我相信你必须把你的问题说得更清楚。您的索引不是从0到n的连续索引。这是你的问题。对吗?那样的话,你需要一张地图。还有:你的键是什么,索引还是字符串?如果您想获取给定字符串的索引,则映射是另一种方式。也许你必须更精确地表述这个问题我正尽可能多地解释。我的索引可以是一个从0开始的已知数字,但考虑到一次可以插入一个元素,对于每个索引,我需要有未知数量的元素。此外,第一个元素可能存储在索引5中。这正是地图可以为您做的。见上面我的答案。映射字符串支持类似字符串的调用;作为它的第一个调用。
listForIndex=map.get(index);如果(listForIndex==null)listForIndex=new ArrayList();添加(字符串)
strings.get(0).add("String1"); // get(0) to obtain the first row, get(1) to obtain the second...
ArrayList<ArrayList<String>> 2D = new ArrayList<ArrayList<String>>();
addStringForIndex(String string, Integer index)
{
    listForString = stringMap.get(index);
    if(listForString == null) {
        listForString = new ArrayList<String>;
        map.put(index, listForString);
    }
    listForString.add(string);
}