当前位置:首页 > 每日看点 > 正文内容

无意中发现技术主管写的代码,大家帮忙看看什么水平?

卡卷网10个月前 (11-19)每日看点160

虽然很多答主用了诸如“典范级”、“心旷神怡” 的形容, 赞美这段代码, 但这里, 出于技术讨论的动机, 我说说不同看法.

  1. 栈, 如果善于利用栈来处理树结构, 那么可以写出更简洁的代码, 根本不需要 recuresiveFn 这种方法.
  2. 泛型, 如果善于利用泛型, 那么可以写出更通用的代码,而不是耦合于某一种类型。
  3. 算法复杂度, 这段代码的时间复杂度是 N*N , 典型的暴力算法
  4. 代码结构, 写这段代码的人, 虽然有“拆分冗长逻辑为一个方法“ 的意识, 但是, 就其解决的问题而言, 代码可以更简洁.
  5. 命名,TreeUtil 是一个很“泛”的命名, 可是其内容中的 MenuTreeObject 却很“具体 ”, 两个 “域” 不匹配. (封面与内容不匹配)
  6. 灵性, 一段代码可以反映其作者在编写时的内心状态, 这位技术主管当时的状态应该不太好, 合理猜测公司加班情况比较严重.


这里给出我的代码方案, 第一版是时间复杂度 O(N^2) 的版本

interface ITreeNode<T extends ITreeNode<T>> { T parent(); void setChildren(List<T> children); List<T> getChildren(); }


class TreeUtil { public static <T extends ITreeNode<T>> List<T> listToTree(List<T> list) { var roots = list.stream() .filter(n -> n.parent() == null) .collect(Collectors.toList()); var stack = roots.stream().collect(Collectors.toCollection(Stack::new)); while (!stack.isEmpty()) { var node = stack.pop(); //每一个元素都需要跟其他所有元素比较,时间复杂度 N*N node.setChildren( list.stream() .filter(n -> n.parent() != null) .filter(n -> n.parent().equals(node)) .collect(Collectors.toList())); node.getChildren().forEach(stack::push); } return roots; } }


第二版利用动态规划的思想, 分解出“自顶向下构建树”的子问题:“给定一个节点,其子节点有哪些”。

只需一次遍历,缓存每一个节点的 父子关系 ,即可得到每个节点,对于这个子问题的结果。

之后便可以自顶向下地构建树。 在构建过程中,每处理一个节点,都是直接从缓存取其子节点,没有重复计算(不需要重复访问不相关的节点),复杂度从平方级降为线性。

class TreeUtil { public static <T extends ITreeNode<T>> List<T> listToTree2(List<T> list) { //第一次遍历: 记录节点间的父子关系 var relations = new HashMap<T, List<T>>(); for (T node : list) { List<T> relation = relations.computeIfAbsent(node.parent(), (p) -> new LinkedList<>()); relation.add(node); } var roots = relations.get(null); //父节点为null的即为根节点 //第二次遍历: 根据父子关系建立树 var stack = roots.stream().collect(Collectors.toCollection(Stack::new)); while (!stack.isEmpty()) { T node = stack.pop(); node.setChildren(relations.getOrDefault(node, Collections.emptyList())); stack.addAll(node.getChildren()); } return roots; } }


下面是测试代码:

static class MenuItem implements ITreeNode<MenuItem> { private Integer id; private String name; private Integer parentId; public MenuItem(Integer id) { this.id = id; } public MenuItem(Integer id, String name, Integer parentId) { this.id = id; this.name = name; this.parentId = parentId; } @Getter @Setter private List<MenuItem> children; @Override public MenuItem parent() { return parentId == null ? null : new MenuItem(parentId); } @Override public boolean equals(Object o) { return o instanceof MenuItem && Objects.equals(id, ((MenuItem) o).id); } @Override public int hashCode() { return Objects.hash(id); } }


public static void main(String[] args) { List<MenuItem> menuList = Arrays.asList( new MenuItem(1, "一级菜单", null), new MenuItem(2, "二级菜单1", 1), new MenuItem(3, "二级菜单2", 1), new MenuItem(3, "三级菜单1", 2), new MenuItem(4, "三级菜单2", 2) ); List<MenuItem> menuTree = TreeUtil.listToTree2(menuList); System.out.println(menuTree); }

运行结果如下:

无意中发现技术主管写的代码,大家帮忙看看什么水平?  第1张

扫描二维码推送至手机访问。

版权声明:本文由卡卷网发布,如需转载请注明出处。

本文链接:https://www.kajuan.net/ttnews/2024/11/949.html

分享给朋友:

相关文章

电脑c盘哪些文件可以删除?

电脑c盘哪些文件可以删除?

电脑上的文件夹都是英文,很多朋友都不敢乱删,下面这几个文件夹里的文件,你可以放心删除。一、可删除的文件1、Backup这是一个备份文件夹,很多装机软件经常会把需要备份的东西,放在这个文件夹中。而当我们需要的软件正常保存之后,这些东西也就没有...

小米14 Pro和Redmi K70Pro怎么选?

小米14 Pro和Redmi K70Pro怎么选?

两款手机都使用了最新的骁龙8Gen3旗舰芯片,性能都是顶级,但是两款手机定位不同,卖点不同,红米K70 Pro定位主打性能的旗舰入门手机,小米14Pro定位旗舰中高端手机。具体根据个人需求与预算来选择:两款手机的相同、相似点:都使用了骁龙8...

有没有推荐什么手游搬砖,或者是用手机就能做的工作能日入100左右就好了?

有没有推荐什么手游搬砖,或者是用手机就能做的工作能日入100左右就好了?

大家好,我是思聪。思聪游戏搬砖社每天分享真实靠谱的游戏赚钱的方法。整个游戏的攻略用一句话概括就是:打元宝兑换平台物品,xx元宝兑换一个分红物品。你把你打游戏得来的元宝去兑换平台的分红物品,就能每天领取xx元的分红。(具体看是哪个分红物品,比...

提升自己最快的方式是什么?

提升自己最快的方式是什么?

1.稻盛和夫说过:“改变自己最快的方法就是做自己害怕的事,不敢做的事,认为自己做不到,觉得不可能的事。如果在自己的舒适区待久了,就会丧失斗志,如果想快速的改变,可以坚持去做一些对自己有益的事。2.早睡早起,坚持运动保持旺盛的精力,人生拼到最...

拼多多百亿补贴买手机电脑等数码产品靠谱吗?

大家很多人都在问pdd百亿补贴购机靠谱吗?首先声明一下,我不是pdd的人,我只是一个普普通通混迹从事pc行业的数码玩家,我只是在评论区看到很多人都在无脑推百亿补贴,特地发一条怗子来说明一下这个东西。此怡不存在偏向引导,此站仅站在我个人角度上...

在追求家居美学的过程中,如何选择一款电视机,使其既具备出色的音画质又能与家居装饰相得益彰?

在追求家居美学的过程中,如何选择一款电视机,使其既具备出色的音画质又能与家居装饰相得益彰?

先看照片,你就说美不美吧?我家这个40平的客厅东西放得不少,其中最提升观感的是各种灯光,在这么多灯光中,是不是第一眼视觉中心就落在了电视上?没错,因为这电视是非常特别的环景光电视,与显示器的神光同步一样,会随着画面的变化而变化不同的光效,它...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。