0

再帰メソッドでイテレータを使用しようとしています。リストに次の要素が残っていない場合は、メソッドを終了する必要があります。iterator.hasNext()しかし、カーソルが最後の位置にある場合は、 returnを使用してチェックします。trueただし、false

アイデアやヒントはありますか?

画像を投稿するつもりはないので、書き留めておきます。これがEclipse-Debugger-Viewに表示されているものです。

iterator             | AbstractList$Itr (id=448)

 - cursor            | 2
 - excpectedModCount | 2
 - lastRet           | 1
 - this$0            | ArrayList<E> (id=438)
 - elemtData         | Object[10] (id=462)

 ---modCount         | 2

 ---size             | 2

これがコードです

static void resolveWithIterator(List<SomethingContext> list, Iterator<ContextResolveHelper> iterator, List<ContextResolveHelper> resolverList)
{
    boolean end = resolverList.iterator().hasNext();
    if (list.size() == 1 || !end){
        resolvedList.add(list);
        return;
    }else{
        ContextResolveHelper acutalEntry = iterator.next();
    List<SomethingContext> tempQRes2 = new ArrayList<SomethingContext>();
        for (SomethingContext smtCtx : list){
            if (//check various things){
                tempQRes2.add(smtCtx);
            }
        }
        resolveWithIterator(tempQRes2, iterator, resolverList);
    }
}
4

2 に答える 2

2

問題はロジック自体にあると思います。あなたが書いたように、次のように関数を呼び出します。

Iterator<ContextResolveHelper> iterator = resolverList.iterator();    
resolveWithIterator(searchCtxResult, iterator, resolverList);

ただし、メソッド自体では、2つの別々のことを行い、次に、提供されたイテレータではなく、新しいイテレータをチェックします。

boolean end = resolverList.iterator().hasNext();

これは、少なくとも1つの要素がある場合は常にtrueを返します。

iterator()を呼び出すと、常に新しいイテレータが返されます。おそらく、パラメータで提供されているイテレータを使用する必要があります。

于 2013-02-01T15:09:47.230 に答える
1

hasNext()私が見るのはresolverList.iterator().hasNext()。毎回新しいイテレータを取得するので、もちろん、リスト自体が空でない限り、常に「次へ」があります。

于 2013-02-01T14:59:57.187 に答える