当前位置: 首页 > news >正文

怎么做网站报价表广州市新闻最新消息

怎么做网站报价表,广州市新闻最新消息,做网站先买域名,dreamweaver网站制作步骤引言: 在日常开发中,我们经常会遇到需要将数据库中返回的数据转成树形结构的数据返回,或者需要对转为树结构后的数据绑定层级关系再返回,比如需要统计当前节点下有多少个节点等,因此我们需要封装一个ListToTree的工具类…

引言:
在日常开发中,我们经常会遇到需要将数据库中返回的数据转成树形结构的数据返回,或者需要对转为树结构后的数据绑定层级关系再返回,比如需要统计当前节点下有多少个节点等,因此我们需要封装一个ListToTree的工具类和学会如何通过深度优先遍历数据。

数据准备:
先简单准备一下具有父子关系的数据。

package data;public class OrgData {private String id;private String pId;private String orgName;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getpId() {return pId;}public void setpId(String pId) {this.pId = pId;}public String getOrgName() {return orgName;}public void setOrgName(String orgName) {this.orgName = orgName;}
}
package data;import java.util.ArrayList;
import java.util.List;public class SingData {public static List<OrgData> getData() {OrgData orgData1 = new OrgData();orgData1.setId("1");orgData1.setpId("root");orgData1.setOrgName("根节点A");OrgData orgData2 = new OrgData();orgData2.setId("2");orgData2.setpId("root");orgData2.setOrgName("根节点B");OrgData orgData3 = new OrgData();orgData3.setId("3");orgData3.setpId("1");orgData3.setOrgName("A目录");OrgData orgData4 = new OrgData();orgData4.setId("4");orgData4.setpId("2");orgData4.setOrgName("B目录");List<OrgData> list = new ArrayList<>();list.add(orgData1);list.add(orgData2);list.add(orgData3);list.add(orgData4);return list;}
}

正常情况下,我们都会选择封装一个将List转换为Tree的工具类,并且通过链式顺序LinkedList存储来遍历Tree数据,这里使用stream来实现,如下:

package data;import java.util.List;public class TreeBean {private String treeId;private String treePid;private String orgName;private Integer flag = 0;private List<TreeBean> children;private OrgData orgData;public String getTreeId() {return treeId;}public void setTreeId(String treeId) {this.treeId = treeId;}public String getOrgName() {return orgName;}public void setOrgName(String orgName) {this.orgName = orgName;}public String getTreePid() {return treePid;}public void setTreePid(String treePid) {this.treePid = treePid;}public List<TreeBean> getChildren() {return children;}public void setChildren(List<TreeBean> children) {this.children = children;}public OrgData getOrgData() {return orgData;}public void setOrgData(OrgData orgData) {this.orgData = orgData;}public Integer getFlag() {return flag;}public void setFlag(Integer flag) {this.flag = flag;}@Overridepublic String toString() {return "TreeBean{" +"treeId='" + treeId + '\'' +", treePid='" + treePid + '\'' +", orgName='" + orgName + '\'' +", children=" + children +'}';}
}

执行结果:

620fc2d13f944d61888c2f0af8198ad2.png

对tree数据进行遍历,通过链表的形式:

import data.OrgData;
import data.SingData;
import data.TreeBean;
import utils.ListToTreeUtil;import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;public class Main {public static void main(String[] args) {// 模拟查询数据List<OrgData> orgDataList = SingData.getData();// 构建tree数据List<TreeBean> treeBean = ListToTreeUtil.toTree(orgDataList, "root");// 使用LinkedList实现链式队列,实现深度遍历LinkedList<TreeBean> stack = new LinkedList<>();stack.addAll(treeBean);while (!stack.isEmpty()) {// 从栈顶开始访问TreeBean pop = stack.peek();// Flag=1表示已经遍历过一次且该节点存在子节点if (pop.getFlag() == 1) {OrgData orgData =pop.getOrgData();List<TreeBean> children = pop.getChildren();// 获取子节点的节点名称,也可以进行其他的操作List<String> collect = children.stream().map(TreeBean::getOrgName).collect(Collectors.toList());StringBuilder builder = new StringBuilder();for (String s : collect) {builder.append(s);builder.append(">");}pop.setOrgName(builder.toString());orgData.setOrgName(pop.getOrgName());// pop出栈,当前节点已经统计完,出栈获取下一个栈顶peekstack.pop();} else {// flag为0表示未遍历,判断是否已经遍历到叶子节点(最底部)if (pop.getChildren()!= null && !pop.getChildren().isEmpty()) {// 非叶子节点pop.setFlag(1);List<TreeBean> children = pop.getChildren();for (TreeBean child : children) {// 将叶子节点入栈,放到栈顶,实现深度遍历,nextstack.push(child);}} else {// 叶子节点直接出栈即可,cnt为本身stack.pop();}}}// 遍历最终的数据for (OrgData orgData : orgDataList) {System.out.println(orgData.toString());}}
}

但是现在有一个问题,当我们响应的数据从OrgData换到其他类型的时候,这时候就需要封装成一个泛型类使得我们的tree数据生成类变成一个通用的,完整代码如下:
完整代码:JAVA将List转为Tree和深度优先遍历

package data;import java.util.List;public interface Tree<T> {String getTreeId();String getTreePid();void setChild(List<T> list);
}
package data;import java.util.List;/*** 实现Tree<OrgData>并定义响应类型为本身* 定义转为树的参数返回
*/
public class OrgData implements Tree<OrgData>{private String id;private String pId;private String orgName;// 转成树需要的参数private Integer flag = 0;private List<OrgData> child;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getpId() {return pId;}public void setpId(String pId) {this.pId = pId;}public String getOrgName() {return orgName;}public void setOrgName(String orgName) {this.orgName = orgName;}public Integer getFlag() {return flag;}public void setFlag(Integer flag) {this.flag = flag;}public List<OrgData> getChild() {return child;}@Overridepublic String toString() {return "OrgData{" +"id='" + id + '\'' +", pId='" + pId + '\'' +", orgName='" + orgName + '\'' +'}';}@Overridepublic String getTreeId() {return id;}@Overridepublic String getTreePid() {return pId;}@Overridepublic void setChild(List<OrgData> list) {this.child = list;}
}

ListToTree方法

package utils;import data.OrgData;
import data.SingData;
import data.Tree;
import data.TreeBean;import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;/*** 将List转为Tree* <T extends Tree>告诉编译器有Tree的get方法**/
public class ListToTreeUtil {public static <T extends Tree> List<T> toTree(List<T> list, String root) {// 当根节点为null时,定义一个初始值,防止nullString treeRoot = "treeRoot";String finalRoot = root;if (list.isEmpty()) {return new ArrayList<>();}// 构建Map数据// 根据pid分组,获取所有的子节点集合Map<String, List<T>> childMap =list.stream().collect(Collectors.groupingBy(item -> {String treePid = item.getTreePid();if (treePid == null) {treePid = treeRoot;}return treePid;}));return list.stream().peek(data -> {List<T> children = childMap.get(data.getTreeId());if (children != null && !children.isEmpty()) {data.setChild(children);}}).filter(data -> data.getTreePid().equals(finalRoot)).collect(Collectors.toList());}
}

深度优先遍历

import data.OrgData;
import data.SingData;
import data.TreeBean;
import utils.ListToTreeUtil;import java.util.LinkedList;
import java.util.List;
import java.util.stream.Collectors;public class Main {public static void main(String[] args) {// 模拟查询数据List<OrgData> orgDataList = SingData.getData();// 构建tree数据List<OrgData> treeBean = ListToTreeUtil.toTree(orgDataList, "root");// 使用LinkedList实现链式队列,实现深度遍历LinkedList<OrgData> stack = new LinkedList<>();stack.addAll(treeBean);while (!stack.isEmpty()) {// 从栈顶开始访问OrgData pop = stack.peek();// Flag=1表示已经遍历过一次且该节点存在子节点if (pop.getFlag() == 1) {List<OrgData> children = pop.getChild();// 获取子节点的节点名称,也可以进行其他的操作List<String> collect = children.stream().map(OrgData::getOrgName).collect(Collectors.toList());StringBuilder builder = new StringBuilder();for (String s : collect) {builder.append(s);builder.append(">");}pop.setOrgName(builder.toString());// pop出栈,当前节点已经统计完,出栈获取下一个栈顶peekstack.pop();} else {// flag为0表示未遍历,判断是否已经遍历到叶子节点(最底部)if (pop.getChild()!= null && !pop.getChild().isEmpty()) {// 非叶子节点pop.setFlag(1);List<OrgData> children = pop.getChild();for (OrgData child : children) {// 将叶子节点入栈,放到栈顶,实现深度遍历,nextstack.push(child);}} else {// 叶子节点直接出栈即可,cnt为本身stack.pop();}}}// 遍历最终的数据for (OrgData orgData : orgDataList) {System.out.println(orgData.toString());}}
}

文章转载自:
http://dinncofaveolate.stkw.cn
http://dinncopropositional.stkw.cn
http://dinncoimpropriation.stkw.cn
http://dinncofelonry.stkw.cn
http://dinncotreponeme.stkw.cn
http://dinncoroominess.stkw.cn
http://dinncopeacekeeper.stkw.cn
http://dinncozolaism.stkw.cn
http://dinncostrategus.stkw.cn
http://dinncounleash.stkw.cn
http://dinncohertfordshire.stkw.cn
http://dinncobuttony.stkw.cn
http://dinncoantiphlogistic.stkw.cn
http://dinncowait.stkw.cn
http://dinncoscarecrow.stkw.cn
http://dinncokgb.stkw.cn
http://dinncomarquis.stkw.cn
http://dinncohomeowner.stkw.cn
http://dinncodreadless.stkw.cn
http://dinncoimpregnate.stkw.cn
http://dinncoserver.stkw.cn
http://dinncoskellum.stkw.cn
http://dinncocovelline.stkw.cn
http://dinncospeakeasy.stkw.cn
http://dinncosort.stkw.cn
http://dinncorakehell.stkw.cn
http://dinncoteachability.stkw.cn
http://dinncodolmen.stkw.cn
http://dinncothingification.stkw.cn
http://dinncoconclusively.stkw.cn
http://dinncobrit.stkw.cn
http://dinncoseawan.stkw.cn
http://dinncocontracyclical.stkw.cn
http://dinncoimmensely.stkw.cn
http://dinncopowerboat.stkw.cn
http://dinnconeedleful.stkw.cn
http://dinncolaevorotatory.stkw.cn
http://dinncorepudiator.stkw.cn
http://dinncogabby.stkw.cn
http://dinncotimeliness.stkw.cn
http://dinncofounder.stkw.cn
http://dinncoesquamate.stkw.cn
http://dinncoundirected.stkw.cn
http://dinncoximenes.stkw.cn
http://dinncobeatific.stkw.cn
http://dinncoarchaeopteryx.stkw.cn
http://dinncoshied.stkw.cn
http://dinncomci.stkw.cn
http://dinncointermediary.stkw.cn
http://dinncoanend.stkw.cn
http://dinncoarchaeozoic.stkw.cn
http://dinncomooncraft.stkw.cn
http://dinncovolume.stkw.cn
http://dinncoprefabrication.stkw.cn
http://dinncoperpetual.stkw.cn
http://dinncosherwani.stkw.cn
http://dinncopurim.stkw.cn
http://dinncotwayblade.stkw.cn
http://dinncotitanium.stkw.cn
http://dinncofasting.stkw.cn
http://dinncotowhead.stkw.cn
http://dinncodeathrate.stkw.cn
http://dinncoabwehr.stkw.cn
http://dinncoasternal.stkw.cn
http://dinncoreject.stkw.cn
http://dinncopromulgator.stkw.cn
http://dinncosuperciliary.stkw.cn
http://dinncolempert.stkw.cn
http://dinncocatamite.stkw.cn
http://dinncodisseize.stkw.cn
http://dinnconorsethite.stkw.cn
http://dinncokazatsky.stkw.cn
http://dinncointent.stkw.cn
http://dinncounsuspectingly.stkw.cn
http://dinncodispenser.stkw.cn
http://dinncoprotamin.stkw.cn
http://dinncodicotyledon.stkw.cn
http://dinncoherniotomy.stkw.cn
http://dinncoevangelism.stkw.cn
http://dinncoryukyu.stkw.cn
http://dinncosharpshooter.stkw.cn
http://dinncosugarless.stkw.cn
http://dinncoheliborne.stkw.cn
http://dinncocarriable.stkw.cn
http://dinncobuckshot.stkw.cn
http://dinncodroll.stkw.cn
http://dinncoextol.stkw.cn
http://dinncoenflame.stkw.cn
http://dinncoslantingways.stkw.cn
http://dinncowed.stkw.cn
http://dinncowore.stkw.cn
http://dinncoavengement.stkw.cn
http://dinncoincandescency.stkw.cn
http://dinncomesic.stkw.cn
http://dinncoconsiderate.stkw.cn
http://dinncolinotype.stkw.cn
http://dinncorolly.stkw.cn
http://dinncoeave.stkw.cn
http://dinncomarrowsky.stkw.cn
http://dinnconaraka.stkw.cn
http://www.dinnco.com/news/124605.html

相关文章:

  • 好的平面设计seo神器
  • 日照网站优化全国疫情排行榜最新情况列表
  • 大型网站如何优化百度知道官网登录入口
  • 深圳建设注册中心网站网络营销顾问招聘
  • 广州网站建设公司小程序软文营销网站
  • 网站建设计划设计方案手机自己怎么建电影网站
  • 做网站前端程序员自然搜索优化
  • 免费建立网站的软件发帖推广平台
  • 建站平台做的网站google百度客服24小时人工服务
  • 社区网站模板代运营哪家比较可靠
  • 个人可以架设网站吗免费推广工具
  • 图书翻页的动画 做网站启动用网上国网app推广
  • wordpress刷关键武汉seo优化顾问
  • 网站菜单导航最新行业动态
  • 新手如何找cps推广渠道百度竞价优化排名
  • 澳门捕鱼网站网址外贸软件排行榜
  • 想建个图片网站seo排名首页
  • 网站后台管理系统开发温州seo优化
  • 做外贸比较好的网站有哪些深圳谷歌seo推广
  • 网站可以免费建设吗百度代发排名
  • 服务器与网站的关系上热门最火标题
  • 做网站为什么需要购买域名网站推广的内容
  • 企业系统包括哪些系统优化设计答案
  • 重庆低价网站建设软文发布网站
  • 网站怎么做自营销seow是什么意思
  • 怎么做购物网站的分类目录营销型企业网站
  • 个人做金融网站能赚钱吗免费做网站软件
  • 专业柳州网站建设哪家便宜青岛网站建设运营推广
  • 千龙网站建设临沂网站建设公司哪家好
  • 十堰网站设计0719web2345浏览器网址