5

私は Java を勉強していますが、ListIterator. 私はこれらの文字のリストを持っています: buongiorn o. 私のコードは「buongiorno」を返しますが、末尾の「o」なしで「buongiorn」を出力することを期待していました。hasNext()私は機能のためにこれを期待していました。私のコードは再帰を使用しています。理由を説明してもらえますか?

public static String creaStringa(List<Character> lista) {
    System.out.println(lista.size());
    ListIterator<Character> it = lista.listIterator();
    return ricCrea(it);
}


public static String ricCrea(ListIterator<Character> it) {
    if(!(it.hasNext())) {
        return "";
    else
        return String.valueOf(it.next()) +ricCrea(it);
}
4

5 に答える 5

8

リストに要素が1つしかない場合は、より明確になります。たとえば、「b」としましょう。hasNext()実際にtrueを返し、それnext()を読み取り、その後反復が終了します。

説明:

Iterator<Object> it= list.iterator()空でないリストを呼び出した場合(要素が 1 つしかない場合でも) true、. hasNext()これは、反復子が最初の要素の前に初期化されるためです。

  b u n g i o r n o
 ^
 i - iterator

呼び出すと、次next()の 2 つのことを行います。

  • イテレータの前の要素を読み取り、
  • 読み取ったばかりの要素の直後、次の要素の前にイテレータを移動します。

あなたの例では、「b」を出力し、「u」の前で停止します。

  b u n g i o r n o 
   ^
   i

そして終了直前:

  b u n g i o r n o
                 ^
                 i

実際には次の値「o」があります。を呼び出すと、next()その値が読み取られ、 の後にジャンプしますo。これ以上の要素はありません。hasNext()false と表示され、呼び出すnext()と例外が発生します。

技術的な詳細:

イテレータの実装方法の基本的な考え方は次のIteratorとおりです。-が であるかどうかを確認するだけです。-を返し、次の要素を表示するように設定します。iterator()ListnexthasNext()next!= nullnext()nextnext

これはjava.util.ArrayListIterator です (一部の詳細は省略されています)。

public Iterator<E> iterator() {
     return new Itr();
}

private class Itr implements Iterator<E> {
     int cursor;       // index of next element to return
     int lastRet = -1; // index of last element returned; -1 if no such
     int expectedModCount = modCount;

     public boolean hasNext() {
         return cursor != size;
     }

     public E next() {
         checkForComodification();
         int i = cursor;
         Object[] elementData = ArrayList.this.elementData;
         cursor = i + 1;
         return (E) elementData[lastRet = i];
     }

 }
于 2013-06-14T01:46:53.013 に答える
1

イテレータは、最初の項目の前の項目への「ポイント」を開始します。

next() は、イテレータが次のアイテムを指すようにし、それを返します。

したがって、実際にはリスト全体を繰り返し処理しています。

これは、反復時に次の構文を有効にするためです。

while (it.hasNext())
{
   ItemClass itemValue = it.next();
   // 値で何かをする
}

イテレータが空の場合でも、同じ構文を使用できます。

于 2013-06-14T01:36:48.723 に答える
0

hasext() メソッドは、リストに残っている文字があるかどうかを知らせるだけです。next() は、文字の値を取得するメソッドです。したがって、havenext() は反復子の位置をインクリメントしません。次の位置に要素があるかどうかを示すだけで、それに基づいて next() を呼び出したり、目的の操作を実行したりできます。

于 2013-06-14T02:27:16.683 に答える