在Java中,我想在列表中使用clear()
方法,以便从子列表中清除的项目也从原始列表中删除。有没有办法创建索引不连续的子列表,这样我仍然可以使用clear()
方法从原始列表中删除项目?
答案 0 :(得分:0)
不。在子列表上调用clear()
会从原始列表中删除元素,但也会更新索引。
如果您想保留索引,而不是使用.clear()
,则可以使用.set(i, null)
- 这将在列表中保留“空插槽”。迭代时你只需要小心。您可以做的另一件事是使用Map<Integer, Foo>
,其中Integer
是您的索引。这样你就可以负责管理指数。
更新:如果您要删除特定元素而非子列表,只需调用.remove(index)
答案 1 :(得分:0)
默认List
实现都不支持此行为。您可以覆盖ArrayList
并支持clear()
,remove()
等。转身并在父列表上调用remove()
。
类似于以下示例代码。但要保持与父母同步,需要做很多工作。如果你可以限制你需要支持的电话数量,那么当然会更容易。
public class SubArrayList<T> extends ArrayList<T> {
public SubArrayList(List<T> parentList, int start, int end) {
...;
}
@Override
public T remove(int index) {
T removed = super.remove(index);
// should not remove by position because position in parent might change
parentList.remove(removed);
return removed;
}
@Override
public T remove(Object obj) {
if (super.remove(obj)) {
parentList.remove(obj);
}
}
}