2013-07-28 2 views
0

나는 목록의 해당 노드를 나타내는 첫 번째, 마지막 다음, 이전 변수와 함께 링크 된 개체의 연결된 목록을 가지고 있습니다. 이 목록은 잘 작동합니다.어떻게 이중 연결 목록에서 값을 추출합니까?

이제 하위 값 (하위 이중 연결된 목록)을 추가하려고합니다. 상위 목록의 각 항목에는 자체 이중 연결 목록이 포함됩니다.

원래 연결된 목록의 항목을 참조하는 데 문제가 있습니다.

일단 연결 값 목록을 만들면 어떻게 값에 액세스 할 수 있습니까?

내가 무엇을 가지고 :

public class Menu<E> { 
private mNode first; 
private mNode last; 
private mNode previous; 
private mNode next; 
private int size = 0; 

public Menu(){ 
    first = null; 
    last = null; 
    previous = null; 
    next = null; 
} 

public Menu(E[] elements){ 
    for (int i = 0; i < elements.length; i++) 
     add(elements[i]); 
} 

private boolean isEmpty(){ 
    return first == null; 
} 

public void add(E e){ 
    mNode currentNode = new mNode(e); 

    if(isEmpty()) 
     first = currentNode;  
    else if (last == null) 
     last = currentNode; 
    else{ 
     last.next = currentNode; 
     currentNode.previous = last; 
     last = currentNode; 
    } 

    size ++; 

} 

mNode 클래스는 정말 아직 완전히 개발하지만 여기에 참조되지 않은 : 그래서 다시

public class mNode<E> { 
E element; 
mNode<E> first; 
mNode<E> last; 
mNode<E> previous; 
mNode<E> next; 
int index; 

public mNode(){ 

} 

public mNode(E e){ 
    element = e; 
} 

} 

, 내가하면 내 질문입니다 연결된 목록에 여러 요소를 추가하여이를 반복하고 모두 인쇄 할 수 있지만 특정 메뉴 항목을 찾고 추출하는 방법은 무엇입니까?

편집 : 선명도

, 내가 가지고 말할 수

항목 1 <> 항목 2 <> 항목 3 <> 첫 번째 목록에서

모든 항목 4. 하위 목록 1 <> 하위 항목 <> 하위 항목 3을 상위 목록의 항목 2에 추가하고 싶습니다.

아이템 2의 mNode는 어떻게 참조합니까? 항목이 메뉴 내부 변수가 아니기 때문에 주요 방법에서

당신은

Menu list = new Menu(); 
list.add(values) // adding all 4 menu items 

당신은 정말 list.get을 할 수 없습니다 (항목 2)을 생성하면.

+0

각 메뉴 항목에 고유 한 ID를 할당하십시오! ID를 통해 특정 메뉴 항목을 추출 할 수 있습니다. – iMBMT

답변

1

메뉴 개체에 추가 방법이 필요합니다. getByIndex(int n) 또는 getByName(String name) (또는 메뉴에 액세스 할 수있는 다른 속성).getByName() 기능을 지원하고 메뉴가 큰 경우 Map과 같은 추가 구조를 사용하려는 경우 고려해야 할 사항 일 수 있습니다.

진짜 질문은 왜 특정 메뉴에 대한 참조를 얻어야합니까? 이상적으로 메뉴에는 두 가지 책임이 있어야합니다. a) 자체 그리기 및 b) 상태가 변경 (즉, 클릭)되었음을 시스템에 알립니다. 이것이 거의 모든 메뉴 시스템이 콜백 메커니즘을 지원하는 이유입니다. Swing에서 메뉴에 대한 작업이 수행되었음을 알리고 응답 할 수있는 ActionListener을 첨부 할 수 있습니다. 이 아이디어를 사용하면 다음과 같은 코드를 얻을 수 있습니다 (전체 코드가 데모가 아닙니다) :

interface MenuListener { 
    public void menuClicked(Menu m); 
    // other type of handlers here, when menu state changes e.g. menuExpanded() 
} 

public class Menu { 
    ... 
    List<MenuListener> listeners = new ArrayList<MenuListener>(); 

    // this method will be called internally by each menu when it detects 
    // that its state changed 
    private void notifyListeners() { 
     for (MenuListener listener : listeners) { 
      // let all the listeners know this menu was clicked 
      listener.menuClicked(this); 
     } 
    } 
}  

// now when menu is created assign a listener to it 
Menu item = new Menu(...); 
item.addMenuListener(new MenuListener() { 
    public void menuClicked(Menu m) { 
     // do something with item here 
    } 
}); 
0

당신은 당신 요소가 다음 발견되는 경우는 무엇 설계에서 누락 된 것은 어떤 데이터입니다

0

해당 요소를 반환합니다 종료 처음부터 LinkedList의를 반복하여 메뉴 클래스 findMenu()에 또 하나의 방법을 쓸 필요가 각 노드에 있습니다.

생각해 보면 다른 노드에 다른 데이터가 필요합니다. 때로는 메뉴 항목을 가질 수도 있고 다른 하위 메뉴 전체를 가질 수도 있습니다. 하위 메뉴는 설계 한 것과 같은 다른 목록이므로 목록 (또는 ...) 목록을 갖게됩니다.이 목록은 트리 구조입니다.

각 노드에 대해 "이 노드에 하위 항목이 있습니까?", "하위 항목 가져 오기"또는 "메뉴 항목 가져 오기"를 묻는 것이 필요합니다. 일단 이것을 해내면 OO 디자인에 대해 생각할 수 있습니다.

메뉴를 탐색하면서 각 노드가 보유하고있는 것을 확인하고 각 경우에 수행 할 작업을 결정할 수 있습니다.

관련 문제