我遇到与在two Dimensional String Array
,String[][]
中动态存储数据相关的问题。
我正在String[i][j]
数组中动态存储数据。这里第一个索引的值是固定的,即i=3
,但第二个索引的值对于所有行都是不同的。
例如,我得到这样的值,
String arrElements[][] = {
{"1"},
{"abc", "xyz", "lkm", "pwd", "srt", "qwert"},
{"1234", "3456"}
};
我正在获得类似这样的价值观。即第一行中只有1个值,第二行和第三行中只有任意数量的值。
如果我这样,
int i = 0, j = 0;
String arrElements[][] = {};
arrElements= new String[3][25];
//What size should I define here.
arrElements[0][0] = "Sahil";
if (a == 0) { //Its just a logical representation of what I might be doing.
// Store the value in second row
arrElements[1][i] = a;
i++;
}
if (a == 1) {
// Store the value in third row
arrElements[2][j] = a;
j++;
}
现在,我在expandable list View
中设置这些值。如果任何行中的值数超过指定的大小,则会给出ArrayOutOfBoundException
。如果大小小于25,则显示空行。
现在,我不想为数组索引提供硬编码大小限制。有没有更好的方法来处理它。
答案 0 :(得分:1)
您可以使用您喜欢的任何数据结构。
在您传递给视图的ExpandableListAdapter
中,请确保从getGroupCount
和getChildrenCount
返回正确的值。在getGroup
和getChild
中,从您使用的任何支持结构(数据库游标,列表,列表列表等)返回相应的数据。
此类列表的一个有用结构是Map<GroupData, List<ChildData>>
。如果项目文本是您拥有的唯一数据,这可能就像HashMap<String, ArrayList<String>>
一样简单。
答案 1 :(得分:1)
作为第一句话:您确定String[][]
是您想要实现的目标的正确数据结构吗?有一大堆Collection
类可能更适合(ArrayList
来命名最明显的)。
如果你真的想继续String[][]
,你不能预先定义子数组的长度,但必须每行声明它:
String[][] foo = new String[4][];
foo[0] = new String[1];
foo[1] = new String[2];
// ....
但正如我所说,对于动态调整大小的嵌套ArrayList
,你可能会更开心:
ArrayList<ArrayList<String>> foo = new ArrayList<ArrayList<String>>();
// Do the following for each row
foo.add(new ArrayList<String>>());
// Do the following to append data in row i
foo.get(i).add("new string");
// Do the following to retrieve column j in row i
foo.get(i).get(j);
根据您实际想要存储的内容,其他数据结构可能更适合。