0

我正在使用一个使用异构“插槽”列表的库。此列表中有几种类型的插槽(输入、输出、存储……),每种类型都在一个连续的范围内。我想使用list.subList(start, end)将这些类型中的每一种都拉到自己的列表中,以便更好地管理,但我仍然需要调用期望原始列表中的索引的库方法,所以我需要一些方法来生成那些来自我的子列表。

是否可以提取原始fromIndextoIndex用于创建子列表?还是我需要自己进行簿记?

4

3 回答 3

1

由于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
}
于 2013-01-06T06:49:06.933 回答
1

你可以通过反射来做到这一点。所有 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;

所以你可以从这里获取你的索引。

于 2013-01-06T07:23:14.367 回答
0

是的,如果您需要开始和结束索引,则必须进行簿记。可以扩展 ArrayList 并覆盖subList,以便返回的 CustomList 具有后备列表的开始和结束索引。

但是您可以对subList诸如此类的所有操作进行所有操作clear() indexOf(),您可以处理子列表并将其反映在父列表中。这在大多数情况下都有帮助。

来自 Javadoc

返回此列表在指定的 fromIndex(包括)和 toIndex(不包括)之间的部分的视图。(如果 fromIndex 和 toIndex 相等,则返回列表为空。)返回列表由此列表支持,因此返回列表中的非结构性更改会反映在此列表中,反之亦然。返回的列表支持此列表支持的所有可选列表操作。这种方法消除了显式范围操作的需要(通常存在于数组中的那种)。通过传递 subList 视图而不是整个列表,任何需要列表的操作都可以用作范围操作。例如,以下习惯用法从列表中删除一系列元素:

  list.subList(from, to).clear();

可以为 indexOf 和 lastIndexOf 构造类似的习语,并且 Collections 类中的所有算法都可以应用于子列表。如果后备列表(即此列表)以除通过返回列表之外的任何方式进行结构修改,则此方法返回的列表的语义将变为未定义。(结构修改是改变这个列表的大小,或者以其他方式扰乱它,使得正在进行的迭代可能会产生不正确的结果。)

于 2013-01-06T06:48:36.170 回答