5

次の再帰関数プロトタイプがあります。

public void calcSim(Type<String> fort, Integer metric)
   Integer metric = 0;
   calcSim(fort, metric);
   System.out.println("metric: " + metric);
}

上記のようにメトリックの値を出力したいと思います。ただし、常にゼロです。これで、関数の最後に出力すると、有効な数値が得られます。

  1. C++ のように参照渡しまたは同等の機能を取得するにはどうすればよいですか
  2. パラメータの受け渡しに関して何ができますか? (値による、参照によるなど...)
4

4 に答える 4

8

Javaには参照渡しのようなものはありません。申し訳ありません:(

オプションは、メソッドに戻り値を与えるか、変更可能なラッパーを使用して値を設定するかのいずれかです。AtmoicInteger を使用するのは JDK にあるため、スレッドセーフを気にしない独自のものを作成すると、もちろん少し速くなります。

AtomicInteger metric = new AtomicInteger(0);
calcSim(fort, metric);
System.out.println("metric: " + metric.get());

次に、calcSim内で次のように設定しますmetric.set(int i);

于 2012-10-19T20:27:36.997 に答える
5

参照渡しの動作を取得するには、ラッパー クラスを作成し、そのクラスに値を設定します。次に例を示します。

class MyWrapper {
    int value;
}

次にMyWrapper、メソッドに a を渡して値を変更できます。たとえば、次のようになります。

public void calcSim(Type<String> fort, MyWrapper metric)
   metric.value++;
   System.out.println("metric: " + metric.value);
   calcSim(fort, metric);
}
于 2012-10-19T20:26:27.273 に答える
2

Integerラッパークラスです。ラッパー クラスは不変です。したがって、あなたが期待していることは、型では達成できませんInteger

プリミティブの周りに変更可能なラッパー クラスを作成し、目的を達成するためにオブジェクトを更新することができます。

于 2012-10-19T20:24:27.357 に答える
1

2 つの大きな問題:

  1. metricメソッドでも同じ名前で再定義しています。プログラムの印刷はどうですか。コンパイル時に文句を言うべきです。

  2. 定義された終了基準はありません。(メソッド)停止をプログラムしますか?

私はあなたが何かを望んでいたと思います(あなたが何をしているのかわからないので疑似コード):

 public void calcSim(Type<String> fort, Integer metric)
   if(condtion){
     //print or return
   }else{
      //modify fort or metric so that it exits
      calcSim(fort, metric); //call this with modified value
      System.out.println("metric: " + metric.value);
   }
 }
于 2012-10-19T20:25:39.840 に答える