gpt4 book ai didi

java - 如何实现此递归算法以根据层次结构中父级的值打开和关闭某些值

转载 作者:行者123 更新时间:2023-12-02 06:49:21 25 4
gpt4 key购买 nike

protected boolean toggleChildVisibility(long itemId) {
for (int i = 0; i < items.size(); i++) {
if (items.get(i).getParentItemId() == itemId) {
Item childItem = items.get(i);

childItem.setCollapsed(!childItem.isCollapsed());

toggleChildVisibility(childItem.getItemId());
}
}
}

我有一个项目列表,每个项目都是子项目或父项目。根父项的parentId等于0,子项的parentId等于其父项的id。

子项下面也可以有子项。

我需要做这样的事情。如果我单击其中一项,我需要其所有子项在展开时折叠,或者在折叠时展开。

我的代码除了一件事之外都有效。假设我折叠了一个 child 的子项目,那么我折叠了一个 parent ,其 child 是我已经折叠的 child 之一。然后这些 child 会扩张,但我不希望他们扩张,因为我刚刚试图崩溃他们的更高 parent 。

任何人都可以帮我解决这个问题,这样当父级折叠时,如果子级已经折叠,子级就不会展开

public class Item {
long questionId;
int depth;

boolean collapsed,childrenCollapsed;

public boolean isChildrenCollapsed() {
return childrenCollapsed;
}

public void setChildrenCollapsed(boolean childrenCollapsed) {
this.childrenCollapsed = childrenCollapsed;
}

public boolean isCollapsed() {
return collapsed;
}

public void setCollapsed(boolean collapsed) {
this.collapsed = collapsed;
}
public long getDepth() {
return depth;
}

public void setDepth(int depth) {
this.depth = depth;
}

}

最佳答案

也许你想做这样的事情:

public void toggleNodeCollapseState(int itemId) {
for (int i = 0; i < items.size(); i++) {
Item childItem = items.get(i);
if (childItem.getParentItemId() == itemId) {
childItem.setCollapsed(!childItem.isCollapsed);
if (childItem.isCollapsed) {
hideItemAndDescendants(childItem);
} else {
showDescendants(childItem);
}
}
}
}

public void hideItemAndDescendants(Item item) {
item.hide();
for (int i = 0; i < items.size(); i++) {
Item childItem = items.get(i);
if (childItem.getId() == item.getId()) {
hideItemAndDescendants(childItem);
}
}
}

public void showDescendants(Item item) {
item.hide();
for (int i = 0; i < items.size(); i++) {
Item childItem = items.get(i);
if (childItem.getId() == item.getId()) {
childItem.show();
if (!childItem.isCollapsed()) {
showDescendants(childItem);
}
}
}
}

关键是节点有两个问题

  1. 它们折叠了吗?
  2. 它们可见吗?还是隐藏?

您可以忽略这种区别,但这将导致崩溃,并且总是崩溃所有后代。这意味着您不能拥有一个未折叠子节点显示孙子节点、折叠该节点、展开节点并看到这些孙子节点与原来相同的折叠状态的节点。 (我发现点击错误的节点并让我在该节点下小心展开的所有内容都折叠起来特别令人恼火,因此我必须重做它。)

单击节点将需要切换折叠状态。

  • 折叠的节点会隐藏其所有后代,但它仍然可见。
  • 未折叠的节点将取消隐藏其所有直接子节点。
    • 如果这些直接子节点未折叠,则应用未折叠节点的子节点可见的规则。因此,它们的直接子节点(原始节点的孙子节点)是取消隐藏的,我们继续取消隐藏未折叠的节点。

关于java - 如何实现此递归算法以根据层次结构中父级的值打开和关闭某些值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18237389/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com