在java中创建系谱树
我的结构如下:在java中创建系谱树,java,tree,Java,Tree,我的结构如下: Member { String firstName; String secondName; Member[] children; Member father; } 我必须用java实现这个树 我有一个成员的名字和第二个名字。我需要找到从根到那个节点的路。 有人能帮我吗 这就是我所拥有的: 公共班级成员{ public List<Member> children = new ArrayList<>(); public M
Member {
String firstName;
String secondName;
Member[] children;
Member father;
}
- 我必须用java实现这个树李>
- 我有一个成员的名字和第二个名字。我需要找到从根到那个节点的路。 有人能帮我吗李>
public List<Member> children = new ArrayList<>();
public Member father = null;
public String secondName = null;
public String firstName = null;
public Member(String secondName, String firstName) {
this.secondName = secondName;
this.firstName = firstName;
}
public Member(String secondName, String firstName, Member father) {
this.secondName = secondName;
this.firstName = firstName;
this.father = father;
}
public List<Member> getChildren() {
return children;
}
public void setFather(Member father) {
this.father = father;
father.addChild(this);
}
public void addChild(String secondName, String firstName) {
Member child = new Member(secondName, firstName);
child.setFather(this);
this.children.add(child);
}
public void addChild(Member child) {
child.setFather(this);
this.children.add(child);
}
public String getSecondName() {
return this.secondName;
}
public String getFirstName() {
return this.firstName;
}
public void setSecondName(String secondName) {
this.secondName = secondName;
}
public void setPrenume(String firstName) {
this.firstName = firstName;
}
public boolean isRoot() {
return (this.father == null);
}
public void deleteFather() {
this.father = null;
}
public List children=new ArrayList();
公共成员父=null;
公共字符串secondName=null;
公共字符串firstName=null;
公共成员(字符串secondName、字符串firstName){
this.secondName=secondName;
this.firstName=firstName;
}
公共成员(字符串secondName、字符串firstName、成员父){
this.secondName=secondName;
this.firstName=firstName;
这个。父亲=父亲;
}
公共列表getChildren(){
返回儿童;
}
公营父亲(成员父亲){
这个。父亲=父亲;
父亲,孩子(这个);
}
public void addChild(字符串secondName,字符串firstName){
成员子成员=新成员(第二名,第一名);
孩子。父亲(这个);
this.children.add(child);
}
公共无效添加子项(成员子项){
孩子。父亲(这个);
this.children.add(child);
}
公共字符串getSecondName(){
返回this.secondName;
}
公共字符串getFirstName(){
返回这个.firstName;
}
public void setSecondName(字符串secondName){
this.secondName=secondName;
}
public void setPrenume(字符串名){
this.firstName=firstName;
}
公共布尔值isRoot(){
返回(this.father==null);
}
公屋{
this.father=null;
}
}您的结构与我在应用程序中使用的ona类似。我通过创建泛型walker来解决这个问题,它从根开始遍历这三个,并使用visitor模式向我提供遍历结果 如果您将其转化为您的问题,它将如下所示:
public class SimpleWalker<T>{
private Visitor<T> visitor;
public SimpleWalker(Visitor<T> visitor) {
this.visitor= visitor;
}
public void walk(Member node) {
if (visitor.visit(node)) {
for (Member child : node.children) {
walk(child);
}
}
visitor.leave(node);
}
public T getResult() {
return visitor.getResult();
}
}
公共类SimpleWalker{
私人访客;
公共SimpleWalker(访客){
这个。访客=访客;
}
公共无效漫游(成员节点){
if(访客访问(节点)){
for(成员子级:node.children){
步行(儿童);
}
}
访客离开(节点);
}
公共T getResult(){
return visitor.getResult();
}
}
然后是访客界面
public interface Visitor<T> {
boolean visit(Member node);
void leave(Member node);
T getResult();
}
公共界面访问者{
布尔访问(成员节点);
作废休假(会员节点);
T getResult();
}
而实现将是这样的
public class Pathfinder implements Visitor<List<Member>> {
final private String firstname, secondname;//passed by constructor
boolean found = false;
List<Member> path = new ArrayList<>();
public boolean visit(Member node) {
if (node.firstname.equals(firstname)
&& node.secondname.equals(secondname)) {
found = true;
return false;
}
return true;
}
public void leave(Member node) {
if (found){
path.add(0, node);
}
}
public List<Member> getResult() {
return path;
}
}
公共类Pathfinder实现访问者{
最后一个私有字符串firstname,secondname;//由构造函数传递
布尔值=false;
列表路径=新的ArrayList();
公共布尔访问(成员节点){
if(node.firstname.equals)(firstname)
&&node.secondname.equals(secondname)){
发现=真;
返回false;
}
返回true;
}
公共作废休假(成员节点){
如果(找到){
添加路径(0,节点);
}
}
公共列表getResult(){
返回路径;
}
}
此解决方案的优点是,无论您想在树中做什么,例如查找元素、计算某人的后代数量,您都可以使用walker,您需要做的就是创建新的访问者。如果您想使用Java swing创建族谱,此Github项目可能会有所帮助:
它使用yFiles for Java库。您可以使用深度优先搜索,我相信,这是一个视频。下面是一些树遍历的代码。这里有一篇wiki文章:如果你想在实现树方面获得帮助/指导,你可以派生
DefaultTreeModel
,为它提供成员
类,从而实现TreeNode
接口。谢谢你,我知道这不是很难,但我是java新手(@SMEău Dev事实上,他定义的已经是一棵树了。@DanilGaponov我知道,但OP似乎仍然“为树而错过森林”。^^^我如何创建新的访问者?@Gabriecomănescu如果你想实例化Pathfinder,你只需执行Pathfinder visitor=新的Pathfinder(“joe”,“blobsky”)
请注意,您需要实现包含两个字符串参数的构造函数。如果您想创建新的自定义访问者,只需实现visitor
接口即可