如何从双链接列表中提取值



我有一个对象的链接列表,这些对象与第一个、最后一个、上一个变量链接在一起,每个变量表示列表中的适当节点。这个列表很好用。

我现在正试图将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项

全部在第一个列表中。我想添加子项1<>子项2<>子项3到父列表中的项2。

如何获得第2项的mNode参考?

在主方法中,一旦创建

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

你不能真的做列表.get(项2),因为项2不是菜单中的变量。

您需要为菜单对象提供其他方法,例如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
    }
});

您需要在Menu类findMenu()中再写一个方法,该方法从头到尾迭代linkedlist。如果找到元素,它将返回该元素

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

仔细想想,在不同的节点中需要不同的数据。有时你可以只有一个菜单项,有时你可以有一个完整的子菜单。子菜单是你设计的另一个列表,所以你会有一个列表列表(或者…):这是一个树状结构。

对于每个节点,您需要能够询问"此节点是否有子节点?"、"获取子节点"或"获取菜单项"。一旦你做到了这一点,你就可以考虑OO设计了。

当您遍历菜单时,您会发现每个节点包含什么,并决定在每种情况下要做什么。

相关内容

  • 没有找到相关文章

最新更新