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