需求:
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;
}
}