图形数据结构递归算法

需求:

A-B, B-C,C-F---->A-B-C-F

以下为代码:

package com.suning.ioss.portal.action.ins;



import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

public class AA {

	static Set<List<Object>> dg(List<NodeBean> value,NodeBean old,Set<List<Object>> list){
			NodeBean oldBean = null;
			int i =0;
			for(NodeBean bean : value){
				oldBean = bean;
				if(old!=null){
					if(bean != old){
						if(old.getChild().equals(bean.getParent())){
							List<Object> list1 = new ArrayList<>();
							System.out.println(old.getParent() + " : " + bean.getParent() + bean.getChild());
							list1.add(old);list1.add(bean);
							list.add(list1);
							if(list!=null &&list.size() >0){
								System.out.println(list);
							}
							dg(value, oldBean,list);
						}else{
							System.out.println(bean);
							++i;
								List<Object> list2 = new ArrayList<Object>();
								list2.add(bean);
								list.add(list2);
						}
					}
				}else{

					dg(value, oldBean,list);
				}
			}
			return list;
	}
	
	static Set<List<Object>> dg2(List<NodeBean> value,NodeBean old,Set<List<Object>> list,List<NodeBean> oo){	
		for (int i= 0; i <value.size(); i++){
			NodeBean nodeBean = value.get(i);
			oo = new ArrayList<NodeBean>();
			if(old == null){
				dg2(value,nodeBean,null,oo);
			}else{
				if(old != nodeBean && old.getParent().equals(nodeBean.getChild())){
					old.setOldNode(nodeBean);
					dg2(value,old,null,oo);
					System.out.println(nodeBean + ""+ nodeBean.getOldNode() + nodeBean.getOldNode().getOldNode() + nodeBean.getOldNode().getOldNode());
					
				}
			}	
        }
			return list;
	}
	
	static List<List<NodeBean>> hg(List<NodeBean> value,List<List<NodeBean>> all,List<NodeBean> temporaryList,int i){
		 List<NodeBean> list = new ArrayList<>();
		for(NodeBean nodeBean : value){
			Boolean dg4 ;
			if(temporaryList!= null && temporaryList.size() > 0){
				dg4 =  dg4(temporaryList, nodeBean);
				if(!dg4){
	        		System.out.println("第"+i+"层"+nodeBean);
	        		list.add(nodeBean);
	        	}
			}else{
				dg4 = dg4(value, nodeBean);
				if(dg4){
	        		System.out.println("第"+i+"层"+nodeBean);
	        		list.add(nodeBean);
	        	}
			}
        }
		if(list!=null && list.size() > 0){
			all.add(list);
			i++;
			hg(value, all, list,i);
		}
		return all;
	}
	
	static List<NodeBean> hf(NodeBean bean,List<List<NodeBean>> all,int i,List<NodeBean> pre,NodeBean temporaryBean,int totalSize) throws CloneNotSupportedException{
		List<NodeBean> list2 = all.get(i);
		boolean flag = true;
		for(NodeBean bean2 : list2){
			NodeBean cloneBean = temporaryBean;
			if(cloneBean ==null)
				cloneBean = (NodeBean) bean.clone();
			if(cloneBean.getChild().equals(bean2.getParent())){
				flag = false;
				boolean isLoop = i + 1 < totalSize;
				cloneBean.setParent(cloneBean.getParent()+":"+cloneBean.getChild());
				cloneBean.setChild(bean2.getChild());
				if(isLoop){
					hf(bean,all,i + 1,pre,cloneBean,totalSize);
				}
				//去除存在节点
				if(!pre.contains(cloneBean)){
					pre.add(cloneBean);
				}
			}
		}
		//如果只有一层,下面几层都没有与之形成链接
		if(flag && i == 1){
			pre.add(bean);
		}
		return pre;
	}
	
	
    /**
     * TODO mock
     * 
     * @param args
     * @throws CloneNotSupportedException 
     */
    public static void main(String[] args) throws CloneNotSupportedException {

        List<NodeBean> value = getInitValue();
        List<List<NodeBean>> all = hg(value, new ArrayList<List<NodeBean>>(),null,1);
        System.out.println("获取层级关系:"+all);
        
        List<NodeBean> list = all.get(0);
        List<NodeBean> finalList = new ArrayList<NodeBean>();
        for(NodeBean bean : list){
        	List<NodeBean> hf = hf(bean, all, 1, new ArrayList<NodeBean>(),null,all.size());
        	finalList.addAll(hf);
        }
        System.out.println("finalList-->"+finalList);
    }
    
    ///判断是否有子节
    private static Boolean dg4(List<NodeBean> value,NodeBean nodeBean) {
    	Iterator<NodeBean> iterator = value.iterator();
    	boolean flag = true;
    	while(iterator.hasNext()){
    		NodeBean bean = iterator.next();
    		if (nodeBean != bean && nodeBean.getParent().equals(bean.getChild())){
    			 flag = false;
    			 break;
    		}
    	}
		return flag;		
	}

	static NodeBean dg3(List<NodeBean> value,NodeBean nodeBean,List<NodeBean> list){
    	Iterator<NodeBean> iterator = value.iterator();
    	while(iterator.hasNext()){
    		NodeBean bean = iterator.next();
    		if (nodeBean.getChild().equals(bean.getParent())){
    			list.add(bean);
    			return bean;
    		}
    	}
    	return null;	
    }

    /**
     * 初始化数据
     * 
     * @return
     */
    private static List<NodeBean> getInitValue() {
        List<NodeBean> init = new ArrayList<NodeBean>();

        NodeBean bean1 = new NodeBean();
        bean1.setParent("A");
        bean1.setChild("B");

        NodeBean bean2 = new NodeBean();
        bean2.setParent("A");
        bean2.setChild("E");

        NodeBean bean3 = new NodeBean();
        bean3.setParent("D");
        bean3.setChild("B");

        NodeBean bean4 = new NodeBean();
        bean4.setParent("D");
        bean4.setChild("E");

        NodeBean bean5 = new NodeBean();
        bean5.setParent("G");
        bean5.setChild("E");

        NodeBean bean6 = new NodeBean();
        bean6.setParent("B");
        bean6.setChild("C");

        NodeBean bean7 = new NodeBean();
        bean7.setParent("B");
        bean7.setChild("F");

        NodeBean bean8 = new NodeBean();
        bean8.setParent("E");
        bean8.setChild("C");

        NodeBean bean9 = new NodeBean();
        bean9.setParent("E");
        bean9.setChild("F");
        NodeBean bean10 = new NodeBean();
        bean10.setParent("C");
        bean10.setChild("I");
        NodeBean bean11 = new NodeBean();
        bean11.setParent("I");
        bean11.setChild("K");
        
        NodeBean bean12 = new NodeBean();
        bean12.setParent("F");
        bean12.setChild("O");

        init.add(bean1);
        init.add(bean2);
        init.add(bean3);
        init.add(bean4);
        init.add(bean5);
        init.add(bean6);
        init.add(bean7);
        init.add(bean8);
        init.add(bean9);
        init.add(bean10);
        return init;
    }
}
package com.suning.ioss.portal.action.ins;




/**
 * 
 */
public class NodeBean {

    /**
     * 属性编码
     */
    private String parent;

    /**
     * 属性值
     */
    private String child;
    
    private NodeBean  oldNode;

    public String getParent() {
        return parent;
    }

    public void setParent(String parent) {
        this.parent = parent;
    }

    public String getChild() {
        return child;
    }

    public void setChild(String child) {
        this.child = child;
    }

    public NodeBean getOldNode() {
		return oldNode;
	}

	public void setOldNode(NodeBean oldNode) {
		this.oldNode = oldNode;
	}

	@Override
    public String toString() {
    	// TODO Auto-generated method stub
    	return this.parent + ":"+ this.child;
    }
	
	@Override
	protected Object clone() throws CloneNotSupportedException {
		NodeBean bean = new NodeBean();
		bean.setParent(this.parent);
		bean.setChild(this.child);
		return bean;
	}
}

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值