1

イテレータを使用して int のスタックを取得するにはどうすればよいですか? オブジェクトを使用し、int を使用しない場合、私のコードはステートメントで機能します。オブジェクトで for ステートメントを使用すると、機能します。整数のオートボクシングと関係がありますか?

public class Simulator {

    public static void main(String[] args) {
        Stack<Integer> s = new Stack<Integer>(); 
        s.insert(15);
        s.insert(25);
        s.insert(7);

        for ( int t : s) {
            System.out.println(t);
        }
    }
}

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package stack;

import java.util.Iterator;

/**
 *
 * @author 
 */
public class Stack<Item> implements Iterable {

    /**
     * @param args the command line arguments
     */
    private Item[] arr;
    private int n; 

    public Stack() {
        System.out.println("Stack initialized");
        arr = (Item[]) new Object[1];
        n = 0;
    }

    public void insert(Item element) {
        if (n == arr.length) {
            resize(arr.length * 2);
        }
        arr[n++] = element;
    }

    @Override
    public Iterator iterator() {
        return new ListIterator(); 
    }

    private class ListIterator implements Iterator<Item> {

        private int i = n; 

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

        @Override
        public Item next() {
            return arr[--i];
        }

        @Override
        public void remove() {
        }
    }

    // resize the underlying array holding the elements
    private void resize(int capacity) {
        assert capacity >= n;
        Item[] temp = (Item[]) new Object[capacity];
        for (int i = 0; i < n; i++) {
            temp[i] = arr[i];
        }
        arr = temp;           
    }
}
4

1 に答える 1

7

最初の問題はあなたのStackクラスにあります。Iterable生の型を実装するだけです。Iterable<Item>代わりに実装する必要があります。Java Generics FAQで raw 型の詳細を参照してください。

を作成することはまだできませんが、反復変数を使用して反復するStack<int>コードは問題ありません。Stack<Integer>int

クラス宣言を次のように変更したら:

class Stack<Item> implements Iterable<Item>

iteratorメソッドを次のように変更しました。

@Override
public Iterator<Item> iterator() {
    return new ListIterator();
}

...配列のキャスト (実際には何もチェックしていない) が原因で lint 警告が引き続き表示されますが、残りは問題ないはずです。

于 2013-10-11T15:21:14.910 に答える