2010-05-10 11 views
5

In C + si possono usare gli iteratori per scrivere in una sequenza. Più semplice esempio potrebbe essere:Esiste un iteratore scrivibile in Java?

vector<int> v; 
for (vector<int>::iterator it = v.begin(); it!=v.end(); ++it) { 
    *it = 42; 
} 

ho bisogno di qualcosa di più complicato - mantenere iteratore come un membro della classe per un uso successivo. Ma non so come ottenere questo comportamento dagli iteratori di Java.

Esistono iteratori scrivibili in Java?
Se no, allora cosa li sostituisce?

risposta

8

Il ListIterator (che è possibile ottenere da List#listIterator()) ha add() e set() metodi che consente di inserire rispettivamente e sostituire l'elemento in corrispondenza dell'indice iterato. Questo è l'unico "iteratore scrivibile" che riesco a pensare in Java.

Non sono sicuro se questo è l'esatta sostituzione del codice C++ dato poiché non conosco il C++.

+0

Grazie. C'è qualcosa di simile per gli array? –

+2

@Lukasz: è possibile trasformare una matrice in una lista (in tempo costante) con 'Arrays.asList' e quindi ottenere da ListIterator. – sepp2k

+1

No, dovresti preferire 'List' su array. 'List' è l'astrazione Java di un array e puoi usare' ArrayList' per avere un array espandibile dinamicamente. Per ulteriori informazioni su 'List' (che fa parte dell'API Java Collections), selezionare [il tutorial Sun sull'argomento] (http://java.sun.com/docs/books/tutorial/collections/index.html). – BalusC

2

Poiché gli array sono accessibili direttamente e rapidamente dal loro indice, non è realmente necessario un oggetto iteratore. Non sarebbe sufficiente per salvare l'indice dell'array in quel membro della classe? Ciò consentirebbe di leggere e scrivere il valore dell'array.

PS: È possibile utilizzare un ArrayList, che è un set di array in crescita automatica e utilizzare ListIterator come descritto da Balus per utilizzare l'approccio iteratore-oggetto.

+0

Per impostare un valore int non sarà sufficiente. Ho bisogno sia di int che di array. –

0

Sembra più che tu voglia un List (o forse qualche altra raccolta, come Set) o un array.

Inoltre, è possibile rendere i contenuti mutabili. Sembra stupido per numeri interi, ma continua il tuo esempio

for (MutableInteger i : CollectionOfMInts) i.setTo(42);