2013-07-28 39 views
0

我有一個鏈接在一起的對象的鏈接列表,其中第一個,最後一個,前一個變量代表列表中的適當節點。這個清單工作正常。如何從雙向鏈表中提取值?

我現在試圖添加SUB值(一個子雙向鏈表)。父列表中的每個項目都將包含自己的雙向鏈表。

我在引用原始鏈接列表中的項目時遇到問題。

一旦你創建了一個鏈接值的列表,你如何訪問它們?

我有:

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

所有在第一個列表。我想將subitem1 <> subitem2 <> subitem3添加到父列表中的Item 2。

如何獲取第2項的mNode的引用?

在main方法,一旦你創建一個

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

你真的不能做一個list.get(第2項),因爲第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

你需要在你的菜單類findMenu(),從開始迭代鏈表寫多了一個方法來結束,如果你元素被找到,那麼它將返回該元素

0

的是從你的設計缺失的是什麼數據將在每個節點中。

如果你仔細想想,你需要不同節點上的不同數據。有時你可能只有一個菜單項,而其他時候你可以有一個完整的子菜單。子菜單是您設計的另一個列表,因此您將擁有一個列表(或...):這是一個樹形結構。

對於您的每個節點,您都需要能夠詢問「該節點是否有孩子?」,「獲取孩子」或「獲取菜單項」。一旦你完成了這個,你可以考慮一個OO設計。

當你遍歷你的菜單時,你會發現每個節點擁有什麼,並決定在每種情況下做什麼。