largest = c;
変数が新しい最高値を持つカードを参照するようにする必要があるため、largest
変数をそのカードに向けるだけです。
次回は、現在返されlargest.getNumber()
ているものc.getNumber()
を返します。
ただし、宣言Card largest;
がループの外にあることを確認してください。
編集:
いくつかの説明を追加し、うまくいけばあなたの質問に答えます.
オブジェクトを次のように宣言すると、次のようになります。
Card c;
カード型の任意のオブジェクト (またはサブクラス) を参照できる参照変数を作成しています。そのオブジェクトのインスタンスを作成することにより...
Card c = new Card();
メモリを予約し、その子オブジェクト/プリミティブを初期化しています。
したがって、次のような関数を書くと:
List<Card> cardStack; //Just assuming you have a List of cards
public Card getLargest() {
Card largest;
Card c;
for (int i = 1, largest = cardStack.get(0); i < cardStack.size(); i++) {
c = cardStack.get(i);
if (largest.getNumber() > c.getNumber()) {
largest = c;
} else if (largest.getNumber() == c.getNumber()) {
if(...)//Check suits as you would
}
}
return largest;
}
スタックに存在する Card オブジェクトを参照する変数を作成しています。参照のために発生する新しいメモリ割り当てはありません (参照を保持するために必要なメモリを除いて)。
その結果、別の場所で作成したカード オブジェクトのリストと、別の場所に保存されているオブジェクトを指す 2 つの参照ができc
ますlargest
。関数から戻るCard
とその参照が返されるため、それに対して行うアクションは、参照しているカードに影響します。
またはclone
、オブジェクトを作成して、同一であるが異なるオブジェクトを送り返します。オブジェクトに加えた変更は、元のカードには影響しません。多くのオブジェクトでは、古いオブジェクトを変更せずに新しいオブジェクトのみを作成できる機能を Immutable と呼びます。たとえば、文字列オブジェクトは不変オブジェクトです。
ループの外側に書き込む必要がCard largest;
あるということは、参照を保持するために割り当てられたメモリがループのスコープ内にのみ存在することを意味します。これを行う場合:
for (....) {
Card largest;
//...
}
...ループが繰り返されるたびに、largest
変数が破棄されて再作成され、変数に保持されている参照またはデータが削除されます。上記のより大きな例では、ループに入れることができます。なぜなら、最大の問題は後で重要であり、ループの持続時間Card c;
だけを気にするからです。c
これを変数スコープと呼びます。