10

for-each ループは、メソッドを再帰的に呼び出すとき、または別のメソッドを呼び出すとき、どのように機能しますか?

例:

for(String permutation : permute(remaining))
    {   

      // Concatenate the first character with the permutations of the remaining chars
      set.add(chars.charAt(i) + permutation);
    }

ちなみに、メソッドpermuteは文字列を受け取り、セットを返します。

ありがとうございました。

4

5 に答える 5

9

ステートメントのJava 言語仕様によると、式は次のとおりです。enhanced for

for ( FormalParameter : Expression ) Statement

次のように実行されます。

for (I #i = Expression.iterator(); #i.hasNext(); ) {
    VariableModifiersopt TargetType Identifier =
        (TargetType) #i.next();
    Statement
}

したがって、Expression(タイプは である必要がありますIterable) は、そのiterator()メソッドが 1 回だけ呼び出されます。

于 2013-01-10T02:26:39.510 に答える
3

一度呼び出し、結果を保存し、foreach を実行します。

このような:

Collection<String> temp = permute(remaining);
for(String permutation : temp) {
...
}

編集:これが再帰的である場合、実際には違いはありません。再帰のすべてのレイヤーには、独自のスコープがあり、したがって独自の「一時」変数があります。したがって、順列関数は最下位レベルに再帰し、その後、各上位レベルは完全に個別の foreachループを連続して実行します。

于 2013-01-10T02:25:47.383 に答える
2

このテストをコンパイルすると

class Test {
    public static void main(String[] args) throws Exception {
        Set<String> set = new HashSet<>();
        for (String s : set) {
        }
    }
}

Test.class を JAD で逆コンパイルすると、javac が for-each をこのコードに置き換えたことがわかります

    Set set = new HashSet();
    String s;
    for(Iterator iterator = set.iterator(); iterator.hasNext();)
        s = (String)iterator.next();
于 2013-01-10T05:17:53.580 に答える
1

あなたの例では、結果はループに入る前にpermute(remaining)評価されます。強化された for ループは、実際にはイテレータの構文糖衣にすぎませんが、他のループと同じ原則に従います。他の処理を行う前に、操作するセットが必要です。

より単純な例は次のようになります。

while(input.hasNext())

これは、無数の行を読み込むプロジェクトで見られるものです。式input.hasNext()は最初に評価する必要があり、その後ループすることができます。

于 2013-01-10T02:27:10.943 に答える
1

Foreach ループは、インターフェイスを実装するすべてのクラスで機能し、およびをIterable呼び出すための構文シュガーにすぎません。同じスレッドの同じループで、関数は 1 回呼び出されます。hasNext()next()Iterator

于 2013-01-10T02:24:00.993 に答える