Java挖掘子孙辈的信息,添加多个家族的多代记录,可以保存个人n代名称


import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

//如何处理文件
//
//	child parent
//	zhangsan xiaoming
//	小明 明爸
//	小明 明妈
//	明儿 小明
//	明女 小明
//
public class HandleFile1 {
	private static class Person
	{
		public String name="";
		public Person(String name)
		{
			this.name=name;
		}
		public String  getName()
		{
			return name;
		}
		List<Person> parents=new ArrayList<Person>();
		public void addParent(Person parent)
		{
			parents.add(parent);
		}
		public  List<Person> getParent()
		{
			return parents;
		}
		public int setparentsize()
		{
			return parents.size();
		}
		
		List<Person> childs=new ArrayList<Person>();
		public void addChild(Person parent)
		{
			childs.add(parent);
		}
		public  List<Person> getChilds()
		{
			return childs;
		}
		public int setchildssize()
		{
			return childs.size();
		}
	}
	/**
	 * 查看列表中是否有one1这个人,使用递归,
	 * @param one1
	 */
	public static Person getperson(Person one1,String name)
	{
//		if(name.equals("明爸"))
//		{
//			System.out.println("123");
//		}
		if(one1.name.equals(name))//如果查找的是当前的人
		{
			return one1;
		}
		if(one1.getChilds().size()>0)//查找当前人的孩子
		{
			Person t=findchild1(one1,name,"","");
			if(t!=null)
			{
				return t;				
			}
			
		}
		if(one1.getParent().size()>0)//查找当前人的父母
		{
			return findparent1(one1,name,"","");
		}
		return null;
	}
	/**
	 * 
	 * @param child
	 * @param name
	 * @param names
	 * fa
	 * ch
	 * @return
	 */
	public static Person findchild1(Person p,String name,String fa,String ch)//遍历所有的儿子
	{
		for(int i=0;i<p.getChilds().size();i++)//遍历他所有的儿子
		{//c-(fa)c-(ch)p
			if(!((Person)p.getChilds().get(i)).getName().equals(ch))//p所有的孩子名称都不等于ch(他的传入孩子)
			{
				if(((Person) p.getChilds().get(i)).getName().equals(name))//找到相同
				{
						return ((Person) p.getChilds().get(i));
				}//没找到,但是他的孩子的孩子数量大于0 p-c-p
				else if((p.getChilds().get(i)).getChilds().size()>0)
				{
					Person p_Model=findchild1(p.getChilds().get(i),name,"",p.getName());//若果返回null没有找到
					if(p_Model!=null)
					{
						return p_Model;
					}
				}
				else if(((p.getChilds().get(i))).getParent().size()>0)没找到,但是他的孩子的父亲的数量大于0 c-p-c
				{
					Person p_Model=findparent1(p.getChilds().get(i),name,p.getName(),"");//若果返回null没有找到
					if(p_Model!=null)
					{
						return p_Model;
					}
				}
			}
		}
		return null;
	}
	public static Person findparent1(Person p,String name,String fa,String ch)//遍历所有的儿子
	{
		for(int i=0;i<p.getParent().size();i++)//遍历他所有的父亲
		{//c-(fa)p-(ch)c
			if(!((Person)p.getParent().get(i)).getName().equals(fa))//p所有的父亲名称都不等于ch(他的传入孩子)
			{
				if(((Person) p.getParent().get(i)).getName().equals(name))//找到相同
				{
						return ((Person) p.getParent().get(i));
				}//没找到,但是他的孩子的孩子数量大于0 c-p-c
				else if((p.getParent().get(i)).getChilds().size()>0)
				{
					Person p_Model=findchild1(p.getParent().get(i),name,"",p.getName());//若果返回null没有找到
					if(p_Model!=null)
					{
						return p_Model;
					}
				}
				else if((p.getParent().get(i)).getParent().size()>0)//c-p-p不需要传参数 p-p-c,需要传参
				{
					Person p_Model=findparent1(p.getParent().get(i),name,p.getName(),"");//若果返回null没有找到
					if(p_Model!=null)
					{
						return p_Model;
					}
				}
			}
		}
		return null;
	}
	public static void main(String[] args) {
		String infos []=new String[]{"child parent","zhangsan xiaoming","小明 明爸","小明 明妈",
				"明儿 小明","明女 小明","明爸 明爷","明孙 明女"};
//		String infos []=new String[]{"child parent","zhangsan xiaoming","小明 明爸","小明 明妈",
//		"明儿 小明","明女 小明"};
		List<Person> list=new ArrayList<Person>();
		Person one=null;
		for(int i=0;i<infos.length;i++)
		{
			String []names=infos[i].split(" ");
			//这套流程下来会把用户信息都添加成功!接下来就是遍历对象了,输出父子类了
			if(names[0].compareTo("child")!=0)
			{
				//首先查看列表中是否有该名称,2检查列表中的对象是否有该名称,3添加新信息
				if(list.size()>0)
				{
					for(int z=0;z<list.size();z++)
					{
						Person one1=list.get(z);//获取列表中的家族对象
						if(one1.name.equals(names[0]))//等与当前循环家族
						{
							Person p2=new Person(names[1]);
							//如果有该父亲,不添加
							p2=findparent1(one1, names[1],"","");
							if(p2==null)
							{
								one1.addParent(new Person(names[1]));
								//也反向添加信息
								for(int a=0;a<one1.getParent().size();a++)
								{
									if(one1.getParent().get(a).getName()==names[1])
									{
										one1.getParent().get(a).addChild(one1);
									}
								}
								break;
							}
							break;
						}
						else if(one1.name.equals(names[1]))//查看是否与父类名称相同,是否添加孩子
						{
							Person p2=new Person(names[0]);
							//System.out.println(one1.getChilds().size());
							//System.out.println(one1.getChilds().get(0).getName());
							p2=findchild1(one1,names[0],"","");
							if(p2==null)
							{
								p2=new Person(names[0]);
								one1.addChild(p2);
								//也反向添加信息
								for(int a=0;a<one1.getChilds().size();a++)
								{
									if(one1.getChilds().get(a).getName()==names[0])
									{
										one1.getChilds().get(a).addParent(one1);
									}
								}
							}
							break;
						}
						//上面时子类对象添加父类,下面时父类对象添加子类对象
						Person p=getperson(one1,names[0]);//寻找子对象
						Person pp=getperson(one1,names[1]);//寻找父对象的方法
						if(p!=null)
						{
							Person fa=new Person(names[0]);
							p.addParent(fa);
							//也反向添加信息
							for(int a=0;a<p.getParent().size();a++)
							{
								if(p.getParent().get(a).getName()==names[1])
								{
									p.getParent().get(a).addChild(p);
								}
							}
						}
						else if(pp!=null)//寻找父对象
						{
							Person son=new Person(names[0]);
							pp.addChild(son);
							//也反向添加信息
							for(int a=0;a<pp.getChilds().size();a++)
							{
								if(pp.getChilds().get(a).getName()==names[0])
								{
									pp.getChilds().get(a).addParent(pp);
								}
							}
						}
						else if(z==list.size()-1)
						{
							Person p1=new Person(names[0]);//添加一个独立的家族
							p1.addParent(new Person(names[1]));
							///###
							//也反向添加信息
							for(int a=0;a<p1.getParent().size();a++)
							{
								if(p1.getParent().get(a).getName()==names[1])
								{
									p1.getParent().get(a).addChild(p1);
								}
							}
							list.add(p1);
							break;
						}
					}
				}
				else//第一次添加信息
				{
					one=new Person(names[0]);
					Person one_p=new Person(names[1]);
					one_p.addChild(one);
					one.addParent(one_p);
					list.add(one);
				}
			}
		}
//		//现阶段已经完成根据根据儿子添加父亲,现在要求根据父亲添加儿子,双方添加都已完成,下面需要寻找爷孙备份关系关系
		for(int i=0;i<list.size();i++)
		{
			down(list.get(i));//
		}
		
	}
	public static Person down(Person p)//查找一个人的子辈是否有
	{
		if(p.getChilds().size()==0)//如果Person没有儿子了,返回空,从底层向上层查找,查找到,所有底层的
		{
			//System.out.println(p.getName());
			print(p);
			return null;
		}
		else
		{
			List<Person> l=p.getChilds();
			for(int i=0;i<l.size();i++)
			{
				down((Person)l.get(i));
			}
		}
		
		return p;
	}
	
	static List<Map<String,String>> ll=new ArrayList<Map<String,String>>();
	//打印爷孙信息
	public static void print(Person p)
	{
		if(p.getParent().size()==0)
		{
			return;
		}
		if(p.getParent().size()>0)
		{
			List<Person> se=p.getParent();
			for(int i=0;i<se.size();i++)//遍历父类的每一个元素
			{
				if(se.get(i).getParent().size()>0)
				{
					/**
					 * se1 是某个人的父亲
					 * **/
					List<Person> se1=se.get(i).getParent(); 
					for(int z=0;z<se1.size();z++)//遍历爷爷被的每一个元素
					{
						boolean isExists=false;
						for(Map<String,String> map:ll)//遍历每个爷孙信息
						{
							Iterator<String> iter =map.keySet().iterator();
							while(iter.hasNext())
							{
								String name=iter.next();
								String value=map.get(name);
								if(name.equals(p.getName())&&se1.get(z).getName().equals(value))
								{
									isExists=true;//判断该爷孙信息已经存在
								}
								//System.out.println(name+"\t:\t"+value);
							}
							
						}
						if(isExists==false)//列表中是否存在
						{
							Map<String,String> m=new HashMap<String,String>();
							m.put(p.getName(),se1.get(z).getName());
							System.out.println("孙:"+p.getName()+"\t爷:"+se1.get(z).getName());
							ll.add(m);
						}
					}
				}
			}
			for(int i=0;i<se.size();i++)//打印元素父类的元素的爷孙
			{
				print(se.get(i));
			}
		}
	}
}

[eclipse运行结果]alt
居中的图片:

转载请声明出处!–https://blog.csdn.net/weixin_43949943/article/details/88552460 某某i表叔:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值