Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269

    Passare elementi da un iteratore all'altro

    Salve ragazzi se ho un iteratore Iterator<T> a e voglio passare tutti gli elementi restituiti da questo iteratore, in un altro iteratore Iteratore<T> b, come faccio?

    Questa soluzione è corretta:

    codice:
    <S> Iterator<S> concat(Iterator<? extends S> a, Iterator<? extends S> b) {
    
    	ArrayList<S> elements = new ArrayList<S>();
    	Iterator<S> c;
    	S x;
    	
    	while (a.hasNext()) {
        		x=a.next();
        		elements.add(x);
    	}
    
    	while (b.hasNext()) {
        		x=b.next();
        		elements.add(beer);
    	}
    
    	c=elements.iterator();
    
    	return c;
    }
    Tenendo presente che gli teratori devono essere compatibili
    Con i sogni possiamo conoscere il futuro...

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Passare elementi da un iteratore all'altro

    Originariamente inviato da gaten
    voglio passare tutti gli elementi restituiti da questo iteratore, in un altro iteratore Iteratore<T> b
    Già questa frase non ha proprio senso. A un iteratore non "passi" nulla.

    P.S. Se vuoi creare un tuo Iterator che "esponga" una unica sequenza derivata dalla unione di 2 Iterator .... beh, questo sì, si può fare. Nel framework standard non mi pare ci sia una funzionalità del genere. O cerchi una libreria che ha funzionalità come queste o implementi tu un Iterator.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    Perfetto, grazie mille per la risposta.
    Inoltre era consigliabile utilizzare una classe anonima del tipo:

    codice:
    return new Iterator<S>() {
    // qui implementazione di next hasNext e remove
    }
    e il metodo next sarebbe stata una cosa del tipo:

    codice:
    public S next() {
        if (a.hasNext())  return a.next();
        if (b.hasNext()) return b.next();
    }
    ??
    Con i sogni possiamo conoscere il futuro...

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da gaten
    codice:
    public S next() {
        if (a.hasNext())  return a.next();
        if (b.hasNext()) return b.next();
    }
    EDIT: mi correggo (ero di fretta), non è corretto (non compila nemmeno).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it L'avatar di gaten
    Registrato dal
    Jul 2007
    Messaggi
    1,269
    codice:
        public <S> static Iterator<S> concat(final Iterator<? extends S> a , final Iterator<? extends S> b) {
            return new Iterator<Object>() {
     
                @Override
                public boolean hasNext() {
                    return a.hasNext() || b.hasNext();
                }
     
                @Override
                public S next() {
                    if (a.hasNext())
                        return a.next();
                    else
                        return b.next();
                }
     
                @Override
                public void remove() {
                    throw new UnsupportedOperationException("Not supported yet.");            
                }
    Nel main avrò una cosa tipo:
    codice:
          ...
         Iterator<S> i = concat(l.iterator(), l1.iterator());
           while (i.hasNext()) {
               System.out.println(i.next());
           }
    Con i sogni possiamo conoscere il futuro...

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da gaten
    codice:
        public <S> static Iterator<S> concat(final Iterator<? extends S> a , final Iterator<? extends S> b) {
            return new Iterator<Object>() {
    Ti correggo solo queste due righe che devono invece essere:
    codice:
        public static <S> Iterator<S> concat(final Iterator<? extends S> a , final Iterator<? extends S> b) {
            return new Iterator<S>() {
    per il resto è ok.

    Vedo che hai anche usato un "bounded wildcard" (il ? extends), ottimo, così è una forma più ampia per poter "catturare" anche iteratori di tipi diversi.

    Originariamente inviato da gaten
    Nel main avrò una cosa tipo:
    codice:
         Iterator<S> i = concat(l.iterator(), l1.iterator());
    <S> non va bene, qui devi avere un tipo reale, ovviamente.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.