2017-07-06 8 views
1

カスタムクラスをイテレータで使用しようとしていますが、foreachを使用して要素を反復処理することはできません。どうすれば対処できますか?私のクラスでforeachを使用できないのはなぜですか?

public class FCSOfOtherClass<Double> { 
private int n; 
private Double[] a; 

public FCSOfOtherClass(int cap) { 
    a = (Double[]) new Object[cap]; 
} 

public void push(Double dou) { 
    if (a.length == n) { 
     this.resize(2 * a.length); 
     a[n++] = dou; 
    } else { 
     a[n++] = dou; 
    } 
} 

private void resize(int max) { 
    Double[] newa = (Double[]) new Object[max]; 
    for (int i = 0; i < n; i++) { 
     newa[i] = a[i]; 
     a = newa; 
    } 
} 

public Boolean isEmpty() { 
    return n == 0; 
} 

public Double pop() { 
    Double dou = a[--n]; 
    a[n] = null; 
    if (n > 0 && n == a.length/2) { 
     resize(a.length/2); 
    } 
    return dou; 
} 

public int size() { 
    return n; 
} 

public Iterator<Double> iterator() { 
    return new RAIterator(); 
} 

private class RAIterator implements Iterator<Double> { 
    private int i = n; 

    @Override 
    public boolean hasNext() { 
     return i > 0; 
    } 

    @Override 
    public Double next() { 
     return a[--i]; 
    } 

    @Override 
    public void remove() { 

    } 

    @Override 
    public void forEachRemaining(Consumer<? super Double> action) { 

    } 

これは私の主な方法である:私はこれを実行すると、私はforeachが私のタイプには適用されないことを私に言ってエラーが出る

public static void main(String[] args) { 
    FCSOfOtherClass<Integer> fcs = new FCSOfOtherClass<>(100); 
    int i = 0; 
    while (!StdIn.isEmpty()) { 
     fcs.push(++i); 
    } 
    for (int j:fcs) { 
     StdOut.print(j); 
    } 
} 

+11

クラスは、for-eachブロックで使用できるように、Iterableインターフェイスを実装する必要があります。 –

+2

無関係ですが、ジェネリック型パラメータの名前を「Double」にしないでください。 'java.lang.Double'ではなく、' Double'型の変数を見るのは非常に混乱します。 'フルーツ'。型変数の場合、[命名規則](https://stackoverflow.com/documentation/java/2697/oracle-official-code-standard/9031/naming-conventions#t=201707061649005848894)は、大文字の大文字、最も一般的には「T」である。あなたの場合、 "element"の 'E 'が別の適切な名前になります。 – Andreas

答えて

6

クラスFCSOfOtherClassにはjava.lang.Iterableが実装されていません。 "foreach"ループはIterableの配列とインスタンスに対してのみ機能します。

あなたはあなたのクラスがIterableを実装することによってこの問題に対処することができます

public class FCSOfOtherClass implements java.lang.Iterable<Double> { 
    ... 
} 

これは、インターフェイスメソッドiterator()の実装を提供する必要があります。あなたのサンプルコードは、すでに行うことを示しています

public Iterator<Double> iterator() { 
    return new RAIterator(); 
} 

これは、Java言語仕様、section 14.14.2: The enhanced for statementで覆われている:

式のタイプは反復処理可能であるか、または配列型(§10.1)しなければなりません、コンパイル時エラーが発生します。

+1

面白いのは、彼がすべてのことをほぼ*正しい*行いました。彼はクラスがIterableインターフェースを実装したと実際に宣言するのを忘れていた;) –

関連する問題