我有多个ArrayList<String>
s“链接”到我用来构建列表视图的自定义适配器中。
现在假设它们总共只有两个,以简化。
我想对其中一个进行排序,然后将这个新顺序反映到另一个中,以保持列表的一致性。
这就是我想要做的事情并且不起作用,以IndexOutOfBoundsException: Invalid index 0, size is 0
签署的*
行结束。
// initial declarations:
List<String> filenameEntries = new ArrayList<String>();
List<String> idEntries = new ArrayList<String>();
/* various operations that fill
the two ArrayList here... */
// sorting:
List<String> oldFilenameEntries = new ArrayList<String>();
List<String> oldIdEntries = new ArrayList<String>();
oldFilenameEntries = filenameEntries;
oldIdEntries = idEntries;
idEntries.clear();
Collections.sort(filenameEntries);
for (int i = 0; i < filenameEntries.size(); i++ ) {
for (int j = 0; j < oldFilenameEntries.size(); j++ ) {
if (oldFilenameEntries.get(j) == filenameEntries.get(i)) {
idEntries.add(oldIdEntries.get(j)); // *
}
}
}
我的想法是搜索新ArrayList中的每个元素,然后使用这个“旧”索引重新编译另一个ArrayList。
(我有限制另一个“已排序”的ArrayList必须再次idEntries
。这是我做这种转移的方式)
有什么建议吗? 感谢。
修改 我认为这是一个排序问题然后出来我错过了为ArrayLists制作副本的正确方法。感谢大家指出错误发生在
oldFilenameEntries = filenameEntries;
oldIdEntries = idEntries;
为什么。
我接受了更快地指出解决方案的答案。 我删除了上面的两行并将之前的内容改为
List<String> oldFilenameEntries = new ArrayList<String>(filenameEntries);
List<String> oldIdEntries = new ArrayList<String>(idEntries);
从我所看到的ATM似乎都按预期工作。
答案 0 :(得分:3)
问题是赋值:oldIdEntries = idEntries;
这导致两个引用都指向同一个列表,所以当你执行idEntries.clear();
时,你已经清除了两个指向的列表。您需要制作列表的副本,而不仅仅是分配参考。
答案 1 :(得分:1)
问题在于以下两行:
oldFilenameEntries = filenameEntries;
oldIdEntries = idEntries;
此后,old...
和原始变量都指向同一个列表。然后你拨打idEntries.clear()
。这会清除idEntries
和oldIdEntries
,因为它们指向相同的列表。
要使其正常工作,您需要复制列表而不是仅仅分配它。您可以使用Collections.copy()
。这是一个例子:
Java Collections copy list - I don't understand
另一方面,这种方法看起来过于复杂 - 但是你也不太清楚你想要完成什么,所以我无法建议更好的方法。
答案 2 :(得分:0)
迭代排序列表,克隆每个对象,然后将其添加到新数组列表
答案 3 :(得分:0)
两个问题: 之一:强>
oldFilenameEntries = filenameEntries;
oldIdEntries = idEntries;
现在,旧条目和新条目都指向同一个列表。
然后,idEntries.clear().
这将清除旧条目和新条目。
如果您想以某种方式,请使用Collections.copy()
<强>两个强> 如果你只是要检查是否相等,我不明白为什么你需要有两个for循环,并且都已经排序。
你可以这样做:
for (int i = 0; i < filenameEntries.size(); i++ ) {
if (oldFilenameEntries.contains(filenameEntries.get(i)) {
idEntries.add(oldIdEntries.get(j)); // *
}
}
}
注意:因为我不知道您的代码的原始点是什么,并且我可以从您的代码段中推断出相等性检查,我建议这样做。