Java 当分支上的任何元素发生更改时,如何标记树结构的整个分支?
我有一个树结构,希望能够标记(例如颜色)从修改节点到根节点的节点。如果任何子节点标记为“已修改”,则应将父节点标记为“已修改”。当子节点返回到未修改的状态时,应根据该节点的状态和其他子节点的状态更新父节点 我试过:Java 当分支上的任何元素发生更改时,如何标记树结构的整个分支?,java,c#,wpf,javafx,Java,C#,Wpf,Javafx,我有一个树结构,希望能够标记(例如颜色)从修改节点到根节点的节点。如果任何子节点标记为“已修改”,则应将父节点标记为“已修改”。当子节点返回到未修改的状态时,应根据该节点的状态和其他子节点的状态更新父节点 我试过: 当单个子项的状态更改时检查所有子项的状态并通知父项。这是低效的,但不占用内存 在“parents”中保留已修改的子项的计数并保持更新,这允许我避免检查单个子项状态更改时的所有子项。这适用于1级以下 这个问题还有其他解决方案吗?你可以打电话给所有孩子,检查他们是否被修改过。然后他们
- 当单个子项的状态更改时检查所有子项的状态并通知父项。这是低效的,但不占用内存
- 在“parents”中保留已修改的子项的计数并保持更新,这允许我避免检查单个子项状态更改时的所有子项。这适用于1级以下
这个问题还有其他解决方案吗?你可以打电话给所有孩子,检查他们是否被修改过。然后他们依次给孩子打电话,例如
public class Node
{
public List<Node> Children { get; set; } = new List<Node>();
private bool _modified = false;
public bool HasBeenModified
{
get => _modified || Children.Any(c => c.HasBeenModified);
set => _modified = value;
}
}
为什么这个问题被标记为/和/?我需要这些技术中的任何一种解决方案。即使是一般的想法也很好。第二种方法有什么问题?当一个子节点被修改时,它会通知它的父节点,父节点会通知它的父节点,依此类推,直到到达根节点为止。当一个子项“未修改”时,同样的通知过程再次发生。而父母只需记下修改过的孩子的数量;如果
count>0
,则它已修改子项。Wpf已路由事件,这些事件会在控件树上冒泡。如果此树结构是wpf树视图,则可以使用属性更改通知。或您可以将父节点的引用传递到子节点,子节点会在修改时通知父节点。一个方法使用它来设置整个集合状态和父状态。@Slaw,你说得对。我最终使用了这种方法。是的,这是一种“暴力”解决方案:)
public static void Main(string[] args)
{
var parentNode = new Node();
var childNodeOne = new Node();
var childNodeTwo = new Node();
var childNodeOneOne = new Node();
childNodeOne.Children.Add(childNodeOneOne);
parentNode.Children.Add(childNodeOne);
parentNode.Children.Add(childNodeTwo);
// Check is currently not modified
Console.WriteLine($"Check: {parentNode.HasBeenModified}");
// Mark node 2 has modified and check again
childNodeTwo.HasBeenModified = true;
Console.WriteLine($"Check: {parentNode.HasBeenModified}");
// Unmark node 2 and make sure it's no longer modified
childNodeTwo.HasBeenModified = false;
Console.WriteLine($"Check: {parentNode.HasBeenModified}");
// Mark the second level child node as modified and check parent is also showing as modified
childNodeOneOne.HasBeenModified = true;
Console.WriteLine($"Check: {parentNode.HasBeenModified}");
Console.ReadKey();
}