web-dev-qa-db-ja.com

イテレータには.next()があります-次の要素ではなく前の要素を取得する方法はありますか?

HashMapで使用するイテレーターがあり、イテレーターを保存してロードします。 Iteratorを使用してHashMapの以前のキーを取得する方法はありますか? (Java.util.Iterator)

更新

これをRed5接続の属性として保存してからロードし直して、停止したところから作業を続行します。

別のアップデート

HashMapのキーセットを反復処理しています

18
ufk

他の人が指摘したように、直接ではありませんが、たとえば以前の1つの要素にアクセスする必要がある場合は、別の変数に簡単に保存できます。

T previous = null;
for (Iterator<T> i = map.keySet().iterator(); i.hasNext();) {
    T element = i.next();

    // Do something with "element" and "previous" (if not null)

    previous = element;
}
15
Jonik

ListIteratorの代わりにIteratorを使用できます。 ListIteratorにはprevious()およびhasPrevious()メソッドがあります。

28
ak_

Iteratorインターフェースで提供されるものではなく、 ListIterator に似た配列セマンティクスが必要なようです。そのようなものを取得する最も簡単な方法は、(キーセット(LinkedList<K> keyList = new LinkedList<K>(map.keySet()))から)リストを作成し、通常のイテレーターまたはforeachの代わりに手動でListIteratorを使用することです。

連続したアイテムを覚える必要がある非常に単純なケースでは、これを処理する最も簡単な方法は、前のキーをローカル変数に格納し、ループの最後でそれを更新することです。

14
Ophidian

いいえ、 Iterator<E> は、3つのメソッドのみを定義します。

boolean hasNext()
E next()
void remove() 

もちろん、独自のイテレータを実装することもできます。

3
Bart Kiers

Setはリバースイテレータのメソッドを提供しませんが、 Deque は提供します。イテレータには descendingIterator()reverseの順序で使用できます iterator()forwards順のイテレータの場合。

(_Deque<T> deque = new LinkedList<T>(set)を介してDequeからSetを作成できます。ここで、setSetであり、Tは使用しているジェネリック型です。)

1
Humphrey Bogart

結局、Iteratorsはあなたの仕事に完全には適していません。

ListからSetを作成して(たとえば、List list = new LinkedList(set)を介して)、標準のインデックス付きforループを使用して繰り返しませんか?これにより、前の要素がi - 1にあることがわかります。

1
Humphrey Bogart

他の人が言ったように、next()を使用して要素にアクセスするだけです。ただし、それは一種用語の問題です。 next()を呼び出すと、this isは現在の要素です。

問題でない限り、各反復でコレクション内の2つの連続する項目を確認する必要があります。その場合、単純な変数が最も簡単に見えます。

1
Mr. Boy

いいえ、できません。 Iteratorインターフェイスには、前の要素を取得するメソッドがありません。

しかし、あなたができることは-少しゴミ-List<Entry<Integer, YourObjectType>>ここで、Integer- valueはキーオブジェクトのハッシュコードを表します。その後、次のようなことができます:

for (int i = 0; i < list.size(); i++)
{
    YourObjectType current = list.get(i).getValue();
    YourObjectType previous = (i == 0 ? null : list.get(i - 1).getValue());
    // Do whatever you want
}

これは非常にごみですが、それは可能です

0

イテレータを使用して、以前のキー値を取得するオプションはありません。 hasNext()およびnext()メソッドのみがあります。

0
GuruKulki

独自のイテレーターを作成します。

public class EnhancedIterator<E> implements Iterator<E>{
    private List<E> list;
    private int indexSelected=-1;
    public EnhancedIterator(List<E> list){
        this.list=list;
    }

    @Override
    public boolean hasNext() {
        return indexSelected<list.size()-1;
    }

    @Override
    public E next() {
        indexSelected++;
        return current();
    }

    @Override
    public void remove() {
        list.remove(indexSelected);
    }
    public void remove(int i){
        list.remove(i);
        if(i<indexSelected){
            indexSelected--;
        }
    }
    public E previous(){
        indexSelected--;
        return current();
    }
    public E current(){
        return list.get(indexSelected);
    }
    public E get(int i){
        return list.get(i);
    }
}
0
Daniel