2012-10-25 26 views
7

Mam problem z arkuszem roboczym, który polega na utworzeniu adaptera do konwersji wyliczenia na iterator. Kiedy próbuję uruchomić poniższy kod, otrzymuję wyjątek wskaźnika pustego.Konwertowanie wyliczenia na Iterator

import java.util.Vector; 
import java.util.Arrays; 
import java.util.Enumeration; 
import java.util.Iterator; 

public class ConvertEnumeration { 

    public static void main(String [] args) { 

     int [] ourArray = {0,1,2,3,4,5,6,7,8,9}; 
     Vector vector = new Vector(Arrays.asList(ourArray)); 

     //Get Enumerator 
     Enumeration enumerator = vector.elements(); 

     EnumerationToIterator enumToIt = new EnumerationToIterator(enumerator); 
     while(enumToIt.hasNext()) { 
      System.out.println(enumToIt.next()); 
     } 
    } 

} 


//Convert our enumeration to Iterator! 
class EnumerationToIterator implements Iterator { 

    //Our enumeration 
    Enumeration enmueration; 

    //Constructor 
    public EnumerationToIterator(Enumeration enmueration){ 
     enmueration = this.enmueration; 
    } 

    //Our Methods 
    public boolean hasNext(){ 
     return enmueration.hasMoreElements(); 
    } 

    public Object next(){ 
     return enmueration.nextElement(); 
    } 

    public void remove(){ 
     throw new UnsupportedOperationException(); 
    } 

} 

Inną kwestią zasługującą na uwagę jest to, że nie mogę wydrukować INT z wyliczenia po Stworzyłem go w pierwszej kolejności.

Odpowiedz

3
public class ConvertEnumeration { 

    public static void main(String [] args) { 

     // int [] ourArray = {0,1,2,3,4,5,6,7,8,9}; 
     Vector<Integer> vector = new Vector<Integer>(Arrays.asList(0,1,2,3,4,5,6,7,8,9)); 

     //Get Enumerator 
     Enumeration<Integer> enumerator = vector.elements(); 

     EnumerationToIterator<Integer> enumToIt = new EnumerationToIterator<Integer>(enumerator); 
     while(enumToIt.hasNext()) { 
      System.out.println(enumToIt.next()); 
     } 
    } 

}  

//Convert our enumeration to Iterator! 
    class EnumerationToIterator<T> implements Iterator<T> { 

     //Our enumeration 
     Enumeration<T> enmueration; 

     //Constructor 
     public EnumerationToIterator(Enumeration<T> enmueration){ 
      this.enmueration = enmueration; 
     } 

     //Our Methods 
     public boolean hasNext(){ 
      return enmueration.hasMoreElements(); 
     } 

     public T next(){ 
      return enmueration.nextElement(); 
     } 

     public void remove(){ 
      throw new UnsupportedOperationException(); 
     } 
    } 
+0

Brak kostki, nadal drukuje śmieci :( – TomSelleck

+0

Dodawanie ogólnego rodzaju pomocy głównej? Zobacz moją zaktualizowaną odpowiedź – jlordo

+0

Wypróbowany kolega nadal bez powodzenia, linia, "Wektor wektor = nowy wektor (Arrays.asList (ourArray)) "Daje błąd" Konstruktor Vector (Lista ) jest niezdefiniowany " – TomSelleck

5

Niewłaściwe przypisanie w konstruktorze. Musi to być this.enmueration = enmueration;
enmueration jest argumentem konstruktora, a atrybutem obiektu jest this.enmueration.

+0

Ah school boy error, thanks !! Szybkie pytanie, które pozbyło się błędu, ale kiedy próbuję wydrukować oryginalne wartości, wypisuje tylko adres pamięci (chyba), np. "[I @ 38f0b51d". Próba rzutowania na int daje ten błąd: "Nie można przesłać do java.lang.Integer" – TomSelleck

+0

Co jest w twoim 'System.out.println();'? – jlordo

+0

System.out.println (enumToIt.next()); daje śmieci i System.out.println ((int) enumToIt.next()) daje błąd – TomSelleck

24

Nie trzeba wymyślać koła na nowo. Po prostu użyj Collections.list(Enumeration<T> e), która zwraca ArrayList<T>. Następnie użyj ArrayList.iterator(), aby uzyskać Iterator.

+1

to jest poprawna odpowiedź –

+2

Adapter jest lepszym wyborem, ponieważ liczba elementów może być ogromny i 'ArrayList' ze wszystkimi elementami zwiększa zużycie pamięci –

+1

@ChristianUllenboom Nie nazwałbym go lepiej tylko dlatego, że są sytuacje, w których jest lepiej.Ta odpowiedź jest doskonała dla większości zastosowań. – Blrp

5

Java 9 oferuje nową domyślną metodę: Iterator<E> asIterator()