我正在使用一个使用异构“插槽”列表的库。此列表中有几种类型的插槽(输入、输出、存储……),每种类型都在一个连续的范围内。我想使用list.subList(start, end)
将这些类型中的每一种都拉到自己的列表中,以便更好地管理,但我仍然需要调用期望原始列表中的索引的库方法,所以我需要一些方法来生成那些来自我的子列表。
是否可以提取原始fromIndex
并toIndex
用于创建子列表?还是我需要自己进行簿记?
我正在使用一个使用异构“插槽”列表的库。此列表中有几种类型的插槽(输入、输出、存储……),每种类型都在一个连续的范围内。我想使用list.subList(start, end)
将这些类型中的每一种都拉到自己的列表中,以便更好地管理,但我仍然需要调用期望原始列表中的索引的库方法,所以我需要一些方法来生成那些来自我的子列表。
是否可以提取原始fromIndex
并toIndex
用于创建子列表?还是我需要自己进行簿记?
由于List.sublist
返回List<T>
,您无法检索用于创建子列表的 from 和 to 索引。但是,没有什么能阻止您自己存储这些索引:您可以轻松地自己编写一个包装器来保存索引,如下所示:
class SubList<T> implements List<T> {
private final int fromIndex;
private final int toIndex;
private final List<T> wrapped;
public SubList<T>(List<T> orig, int from, int to) {
wrapped = orig.subList(from, to);
fromIndex = from;
toIndex = to;
}
public int getFromIndex() {
return fromIndex;
}
public int getToIndex() {
return toIndex;
}
public T get(int index) {
return wrapped.get(index);
}
public int indexOf(object o) {
return wrapped.indexOf(o);
}
...
// Implement the remaining List<T> methods here
}
你可以通过反射来做到这一点。所有 JCF 列表都继承 AbstractList.sublist
public List<E> subList(int fromIndex, int toIndex) {
return (this instanceof RandomAccess ?
new RandomAccessSubList<>(this, fromIndex, toIndex) :
new SubList<>(this, fromIndex, toIndex));
}
RandomAccessSublist 是 SubList 的子类。这是子列表
class SubList<E> extends AbstractList<E> {
private final AbstractList<E> l;
private final int offset;
private int size;
所以你可以从这里获取你的索引。
是的,如果您需要开始和结束索引,则必须进行簿记。可以扩展 ArrayList 并覆盖subList
,以便返回的 CustomList 具有后备列表的开始和结束索引。
但是您可以对subList
诸如此类的所有操作进行所有操作clear()
indexOf()
,您可以处理子列表并将其反映在父列表中。这在大多数情况下都有帮助。
来自 Javadoc
返回此列表在指定的 fromIndex(包括)和 toIndex(不包括)之间的部分的视图。(如果 fromIndex 和 toIndex 相等,则返回列表为空。)返回列表由此列表支持,因此返回列表中的非结构性更改会反映在此列表中,反之亦然。返回的列表支持此列表支持的所有可选列表操作。这种方法消除了显式范围操作的需要(通常存在于数组中的那种)。通过传递 subList 视图而不是整个列表,任何需要列表的操作都可以用作范围操作。例如,以下习惯用法从列表中删除一系列元素:
list.subList(from, to).clear();
可以为 indexOf 和 lastIndexOf 构造类似的习语,并且 Collections 类中的所有算法都可以应用于子列表。如果后备列表(即此列表)以除通过返回列表之外的任何方式进行结构修改,则此方法返回的列表的语义将变为未定义。(结构修改是改变这个列表的大小,或者以其他方式扰乱它,使得正在进行的迭代可能会产生不正确的结果。)