我有一个对象的链接列表,这些对象与第一个、最后一个、上一个变量链接在一起,每个变量表示列表中的适当节点。这个列表很好用。
我现在正试图将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设计了。
当您遍历菜单时,您会发现每个节点包含什么,并决定在每种情况下要做什么。