我有一个链接在一起的对象链接列表,其中包含第一个,最后一个,下一个,前一个变量,每个变量代表一个列表中的相应节点。这个清单工作正常。
我现在正在尝试添加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&lt;&gt;第2项&lt;&gt;项目3&lt;&gt;第4项
全部在第一个列表中。我想添加subitem1&lt;&gt; subitem2&lt;&gt; subitem3到父列表中的第2项。
如何引用第2项的mNode? p>
创建
后,在main方法中Menu list = new Menu();
list.add(values) // adding all 4 menu items
你不能真正做一个list.get(第2项),因为第2项不是菜单内的变量。
答案 0 :(得分: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
}
});
答案 1 :(得分:0)
您需要在Menu类findMenu()
中再编写一个方法,如果找到元素,则会从头到尾迭代链表,然后它将返回该元素
答案 2 :(得分:0)
您的设计缺少的是每个节点中的数据。
如果您考虑一下,您需要在不同节点中使用不同的数据。有时你可能只有一个菜单项,有时你可以有一个完整的子菜单。子菜单是您设计的另一个列表,因此您将拥有一个列表(或......):这是一个树结构。
对于每个节点,您需要能够询问“此节点是否有子节点?”,“获取子节点”或“获取菜单项”。完成此操作后,您可以考虑OO设计。
当你遍历你的菜单时,你会发现每个节点都有什么,并决定在每种情况下做什么。