0

私は「スロット」の異種リストを使用するライブラリを使用しています。このリストにはいくつかのタイプのスロット(入力、出力、ストレージなど)があり、それぞれが連続した範囲にあります。これらの各タイプを独自のリストにプルして、管理を改善したいlist.subList(start, end)のですが、元のリスト内のインデックスを期待するライブラリメソッドを呼び出す必要があるため、作成する方法が必要です。私のサブリストからのもの。

fromIndexオリジナルを抽出しtoIndexてサブリストを作成することは可能ですか?それとも、自分でその簿記を実行する必要がありますか?

4

3 に答える 3

1

あなたは反射でそれを行うことができます。すべてのJCFリストはAbstracList.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 に答える
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 に答える
0

はい、開始インデックスと終了インデックスが必要な場合は、簿記を行う必要があります。subList返されるCustomListがバッキングリストの開始インデックスと終了インデックスを持つように、ArrayListを拡張してオーバーライドすることができます。

subListただし、 likeなどですべての操作をclear() indexOf()実行でき、subListを処理でき、それが親リストに反映されます。これはほとんどの場合に役立ちます。

Javadocから

指定されたfromIndex(包括的)とtoIndex(排他的)の間のこのリストの部分のビューを返します。(fromIndexとtoIndexが等しい場合、返されるリストは空です。)返されるリストはこのリストに基づいているため、返されるリストの非構造的な変更はこのリストに反映され、その逆も同様です。返されるリストは、このリストでサポートされているすべてのオプションのリスト操作をサポートします。このメソッドは、(配列に一般的に存在する種類の)明示的な範囲操作の必要性を排除します。リスト全体ではなくsubListビューを渡すことにより、リストを期待するすべての操作を範囲操作として使用できます。たとえば、次のイディオムは、リストから要素の範囲を削除します。

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

indexOfとlastIndexOfについても同様のイディオムを作成でき、CollectionsクラスのすべてのアルゴリズムをsubListに適用できます。このメソッドによって返されるリストのセマンティクスは、バッキングリスト(つまり、このリスト)が、返されたリスト以外の方法で構造的に変更された場合、未定義になります。(構造上の変更とは、このリストのサイズを変更するもの、または進行中の反復によって誤った結果が生じる可能性があるような方法でリストを混乱させるものです。)

于 2013-01-06T06:48:36.170 に答える