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(Item 2) 因为 Item 2 不是菜单内的变量。

4

3 回答 3

1

您需要对菜单对象使用其他方法,例如getByIndex(int n)getByName(String name)(或您的菜单可访问的任何其他属性)。如果您希望支持某个功能,并且如果您的菜单很大,则可能需要考虑getByName()使用类似 a 的附加结构。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
    }
});
于 2013-07-28T08:39:10.063 回答
0

您的设计中缺少的是每个节点中的数据。

仔细想想,不同的节点需要不同的数据。有时你可能只有一个菜单项,有时你可能有一个完整的子菜单。子菜单是您设计的另一个列表,因此您将拥有一个列表列表(或...):这是一个树结构。

对于每个节点,您需要能够询问“这个节点有子节点吗?”、“获取子节点”或“获取菜单项”。完成此操作后,您可以考虑 OO 设计。

当你浏览你的菜单时,你会发现每个节点都有什么,并决定在每种情况下做什么。

于 2013-07-28T05:44:07.507 回答
0

您需要在 Menu 类中再编写一个方法,findMenu()如果找到您的元素,它会从头到尾迭代链表,然后它将返回该元素

于 2013-07-28T05:23:03.423 回答