有问题..我有一个mp3文件名列表 添加新文件名使用:
musicList.add(new Mp3(id, filename));
现在我想创建一个包含此列表的数组
private static final int LIST_COUNT = 8;
public static List<List<Mp3>> musicLists = new ArrayList<List<Mp3>>(LIST_COUNT);
private void parseMus(){
musicLists = new ArrayList<List<Mp3>>(LIST_COUNT);
...
//gettin mp3 list id,filename, length
...
musicLists.get(listNr).add(new Mp3(id,filename,length));
...
}
但它给了我错误:
03-15 21:01:36.030: E/AndroidRuntime(3393): java.lang.IndexOutOfBoundsException: Invalid index 4, size is 0
第二个问题! 现在我编辑了代码并且没有错误......但是现在我得到的是所有列表都填充了相同的列表..所以当我试着看到:
for(int i =0; i< Settings.musicLists.size();i++){
if(D)Log.e("visio added","MP3 file muslist nr="+i+"= "+Settings.musicLists.get(i));
}
我显示了8行相同的行......我做错了什么?
答案 0 :(得分:5)
musicLists = new ArrayList<List<Mp3>>(LIST_COUNT);
您似乎认为此行会创建一个包含8个列表的列表。但是,它真正做的是创建一个具有初始容量8的列表的空列表。也就是说,它实际上不会将任何列表填充到musicLists
中。
为了实现这一目标,您需要初始化musicLists
,然后使用musicLists.add(foo)
向其中添加8个List<Mp3>
个对象。
答案 1 :(得分:1)
正如VeeArr所说,在获得列表之前,你需要用列表填充列表。
// this creates an empty list of initial capacity 8
musicLists = new ArrayList<List<Mp3>>(8);
// musicList.size() is still 0
// we can add as much items as we want, the list will dynamically grow.
for (int i = 0; i < 8; i++) {
List<Mp3> emptySubList = new ArrayList<Mp3>();
// emptySubList.size() is 0 each as well.
musicList.add(emptySubList);
}
// musicList.size() is 8 now.
// do your stuff...
musicLists.get(listNr).add(new Mp3(id,filename,length));
您可以为ArrayList
指定的初始容量只是一种提高内存消耗的方法。
ArrayList
不同, array[]
可以动态增长。他们通过内部保留array[]
来实际存储您放置在ArrayList
中的数据。如果他们需要的尺寸大于array[]
可以容纳的尺寸,他们会创建一个更大的array[]
并将内容复制到新版本(大小总是加倍)。
这很好,因为你不必担心自己这样做。但复制阵列很昂贵。因此,您可以定义一个初始大小,以暗示您应该期望一定数量元素的ArrayList
。如果你不提供初始容量,通常会很好,除非你真的知道你需要多少物品。