2012-10-25 2 views
7

列挙をIteratorに変換するためのアダプタを作成することに問題があります。次のコードを実行しようとすると、NULLポインタ例外が発生します。列挙を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(); 
    } 

} 

もう1つの注意点は、最初に作成した後、列挙体からintを印刷できないことです。

答えて

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

ダイスマンではなく、まだゴミを印刷しています:( – TomSelleck

+0

メインクラスのヘルプにジェネリックタイプを追加していますか?更新された回答を参照してください。 – jlordo

+0

試してみました。 ); "コンストラクタVector (リスト)は未定義です – TomSelleck

5

コンストラクタに間違った割り当てがあります。 this.enmueration = enmueration;
enmuerationがコンストラクタ引数で、this.enmuerationがオブジェクト属性である必要があります。

+0

ああ、学校の男の子の誤差を、ありがとう!!クイック質問、それはエラーを取り除いたが、元の値をプリントアウトしようとすると、メモリアドレスだけが印刷されます(たとえば、 "[@ @ 38f0b51d"])。 intにキャストしようとすると、 "java.lang.Integerにキャストすることはできません" – TomSelleck

+0

あなたの 'System.out.println();'の内部には何がありますか? – jlordo

+0

System.out.println(enumToIt.next());ガベージを返し、System.out.println((int)enumToIt.next())はエラーを返します – TomSelleck

24

ホイールを再発明する必要はありません。 Collections.list(Enumeration<T> e)を使用すると、ArrayList<T>が返されます。次にArrayList.iterator()を使用してIteratorを取得します。

+1

これは正解です –

+2

の要素が巨大になり、すべての要素を含む 'ArrayList'がメモリ消費量を増やします。 –

+1

@ChristianUllenboomこのような状況が良いというだけで、私はそれをより良く呼び出すことはできません。 – Blrp

5

のJava 9は、新しいデフォルトの方法で提供しています:Iterator<E> asIterator()

関連する問題