2012-04-26 2 views
1

원본 코드에서 노드를 트리에 추가하고 있습니다. 내 목표는 어떻게 든 트리에 추가 한 마지막 노드에 대한 액세스 권한을 얻는 것입니다. 내 아이디어는 마지막 객체 (원래 예제의 노드)를 가리키는 다른 객체를 만드는 것입니다.Class에있는 객체의 주소를 인수로 복사하여 나중에 객체를 변경할 수 있습니다.

public class RandomSubClass 
{ 
    int firstNum; 
}  

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; 
    } 
} 

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); 
    } 
} 

나는 트리에 추가 한 후 노드에 대해 뭔가를 확인하려면, 그것은 몇 가지 조건을 만족하는 경우, 그에 대한 플래그를 변경하려면 마디.

노드를 다시 추적 할 수 있지만 (루트에서 시작) 내 트리가 어느 정도 커질 수 있으며 시간이 오래 걸릴 수 있습니다. 따라서 노드를 추가 할 때 해당 노드의 주소를 얻고 조건을 확인한 후 해당 노드의 플래그가 변경 될 것임을 알면서 해당 주소의 플래그를 수정할 수 있습니다 (마지막으로 추가됨).

답변

2

예, 가능합니다. 너에게 허락 해 준다. :-)하지만 Java 객체는 참조가 아닌 값으로 전달되기 때문에 예제 코드가 작동하지 않습니다. 즉, 개체를 함수에 전달하면 해당 개체를 다시 할당해도 호출자에게는 아무런 영향이 없습니다. 예 :

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

이 기능의 출력은 "안녕"이 아니라 "안녕"입니다. 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

어떻게 리턴 값으로 그 일에 대해 :

모든 개체가 반환됩니다 자바에서는
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 나는 단지 실패를 나타내는 방법에서'거짓 '을 반환하는 것은 아주 좋은 접근 방법이 아니라고 말하고 싶습니다.Java 라이브러리에는 이러한 메소드가 몇 가지 있지만, 그렇게하면 다른 것을 반환하는 옵션이 없어집니다. 최선의 해결책은 실패를 나타내는 예외를 사용하는 것입니다. 'Exception'을 확장 한 클래스를 작성한 다음,'RandomSubClass addItem (int firstNum) throws ItemAdditionFailedException' 또는 그와 비슷한 것을 작성하십시오. – MarioDS

+0

나는 나무에 고유 한 노드를 추가하고 있는데, '성공적으로 추가되었습니다'라는 의미는 동일한 값을 가진 노드가 없으므로 트리가 변경된 것입니다. 나중에이 값을 사용하여 더 많은 작업을 수행 할 것입니다. 나는이 상황에서 예외를 사용할 수 있다고 생각하지 않는다. 내가 틀렸다면, 또는 내 상황에 대해 좋은 또 다른 방법이 있다면. –

0

/주소로 매개 변수를 통해 통과시켰다. 주소를 사용하여 기본 유형을 전달하려는 경우 기본 유형 (int, float, double ...) 만 전달됩니다. - double 대신 double 사용 - Float 대신 float -ect ...

관련 문제