2012-04-26 1 views
1

私の元のコードでは、ノードをツリーに追加します。私の目標は、ツリーに追加した最後のノードに何とかアクセスすることです(私の考えは、最後のオブジェクト(元の例のノード)を指す別のオブジェクトを作成することでした)。クラス内のオブジェクトのアドレスを引数にコピーして、後でそのオブジェクトに変更を加えることができます

public class RandomSubClass 
{ 
    int firstNum; 
}  

import java.util.LinkedList; 

public class RandomClass 
{ 
    LinkedList<RandomSubClass> myListOfObjects = new LinkedList<RandomSubClass>(); 

    void addItem(int firstNum, RandomSubClass toBeReturned) 
    {  
     RandomSubClass o1 = new RandomSubClass(); 
     o1.firstNum = firstNum; 
     myListOfObjects.add(o1); 

     // Here I was thinking that 'toBeReturned' will get same address as 
     // 'o1', and by changing 'toBeReturned' (in main), values in 'o1' change 
     // 
     toBeReturned = o1; 

     // This following commented code worked, 
     // but I can't use it in my original code. 
     // 
     // The reason I can't use it is because when I add a node to a tree, 
     // I start at the root and trace the new node's way to a new leaf, 
     // which makes it hard to do (simply) that. 
     // 
     //toBeReturned.firstNum = firstNum; 
     //myListOfObjects.add(toBeReturned); 
    } 
} 

public class Main 
{ 
    public static void main(String[] args) 
    { 
     RandomClass myList = new RandomClass(); 

     RandomSubClass r1 = new RandomSubClass(); 
     RandomSubClass r2 = new RandomSubClass(); 

     myList.addItem(1, r1); 
     myList.addItem(2, r2); 

     // I would like to do that, and see changes in the node in 'myList' 
     // 
     r1.firstNum = 10; 
     r2.firstNum = 20; 
    } 
} 

私はツリーに追加した後、ノードについて何かを確認したい、そしてそれは、いくつかの条件を満たしている場合、私は、そのためのフラグを変更したいですノード。

ノードを再トレースすることができます(ルートから開始します)が、ある時点でツリーが大きくなり、時間がかかることがあります。だから私はそれを追加すると、そのノードのアドレスを取得し、私の状態を確認した後、私はそのノード(最後に追加)でフラグを変更することを知って、そのアドレスでフラグを変更することができます。

答えて

2

はい、これを行うことができます。私はあなたに許可を与える。 :-)しかし、Javaオブジェクトは参照渡しではなく値渡しされるため、サンプルコードは機能しません。つまり、オブジェクトを関数に渡すと、そのオブジェクトを再割り当てすると、呼び出し元には影響しません。たとえば:

void caller() 
{ 
    String s1="Hello"; 
    updateString(s1); 
    System.out.println(s1); 
} 
void updateString(String s1) 
{ 
    s1="Goodbye"; 
} 

この関数の出力は、 "こんにちは"、NOT "さようなら" です。 updateString関数内の代入は、呼び出し元によって渡された値を変更しません。

あなたには、少なくとも3つの方法があります。

方法1:私はいくつかの他の戻り値を持っている必要はありません。何この方法を好む

SomeObject addItem(int firstnum) 
{ 
    SomeObject o1=new SomeObject(); 
    o1.firstnum=firstnum; 
    objectList.add(o1); 
    return o1; 
} 
... 
void callingFunction() 
{ 
    SomeObject newObject=addItem(1); 
    newObject.secondnum=2; 
    ... etc ... 
} 

:最も単純ではなく、パラメータを更新するよりも、新しいオブジェクトを返すことです、それはクリーンでシンプルです。

方法2:グローバル変数を作成し、そこにオブジェクトのハンドルを格納します。しかし、この方法は大嫌いです。なぜなら、グローバルは一般的に吸うからです。私はあなたにそれをしないように伝えるためにそれを言います。

方法3:オブジェクトへの参照を保持するラッパーを作成します。次に、クラス内の値を更新できる「追加」関数にラッパーを渡します。

class SomeObjectWrapper 
{ 
    public SomeObject someObject; 
} 
... 
void addItem(int firstnum, SomeObjectWrapper sow) 
{ 
    SomeObject o1=new SomeObject(); 
    o1.firstnum=firstnum; 
    objectList.add(o1); 
    sow.someobject=o1; 
} 
... 
void callingFunction() 
{ 
    SomeObjectWrapper sow=new SomeObjectWrapper(); 
    SomeObject newObject=addItem(1, sow); 
    sow.someObject.secondnum=2; 
    ... whatever ... 
} 
1

どのように戻り値でそれをやっについて:

すべてのオブジェクトが返されたJavaで
RandomSubClass addItem(int firstNum) 
{  
    RandomSubClass o1 = new RandomSubClass(); 
    o1.firstNum = firstNum; 
    myListOfObjects.add(o1); 

    // Here I was thinking that 'toBeReturned' will get same address as 
    // 'o1', and by changing 'toBeReturned' (in main), values in 'o1' change 
    // 
    .... 
    return o1 
} 
+0

ありがとうございます。この方法を試してみましたが、うまくいきましたが、すでにノードが正常に挿入されたかどうかを示すブール値フラグを返しています。これが良いアプローチであれば、 'RandomSubClass'を返すことができ、ノードが正常に追加されたかどうかを示すブール値フラグを参照で渡すことができます。 –

+0

@RoronoaZoro私は、単に失敗を示す方法で 'false'を返すことは非常に良いアプローチではないと言いたいと思います。私はJavaライブラリにこれらのメソッドがいくつかあることを知っていますが、そうすると他のものを返すオプションがなくなります。最善の解決策は、障害を示すために例外を使用することです。 'Exception'を拡張したクラスを作成し、' RandomSubClass addItem(int firstNum)throws ItemAdditionFailedException'またはそのようなものを作成します。 – MarioDS

+0

私はツリーに一意のノードを追加しています。「正常に追加されました」というのは、ツリーが変更されたため、同じ値を持つノードがなかったということです。私は後でこの値を使ってより多くのことをします。私はこのケースで例外を使うことはできないと思っています。私が間違っている場合や、自分の状況について別の良い方法があるかどうかを確認してください。 –

0

/アドレスでパラメータを経由して渡されます。アドレスで使用するプリミティブ型を渡す場合は、プリミティブ型(int、float、double ...)のみを渡します。 -doubleの代わりにdoubleを指定します。 -FloatではなくFloat -ect ...

関連する問題