怎麼用易理解的方式實現樹狀圖?

傳統用遞歸,先查出全部頂級父節點,再循環調用 getChild(),在 getChild() 中遞歸調用 getChild()。java

這種方式我以爲不太好理解,複雜度詳細爲 n + n(全部的孩子節點個數),第一個 n 爲查出全部父節點的執行次數,n(父節點個數 + 全部的孩子節點個數)表示每次都會從集合中判斷是否有子節點。若是集合中是一個完整的樹結構,那麼父節點個數 + 全部孩子節點個數 = n,即計算次數爲 n^2 + n,大O表示法爲 O(n^2)spa

我是這麼作的,雙層 for 循環匹配子節點,再過濾掉集合中全部子節點。代碼以下:日誌

@Data
public class CommentTreeRespDto implements Serializable {

    private static final long serialVersionUID = 9098462797193334657L;

    @ApiModelProperty(value = "評論父id,頂級父id爲00000-00000-00000-00000")
    private String parentId;

    @ApiModelProperty(value = "當前日誌評論的id")
    private String id;

    @ApiModelProperty(value = "評論內容")
    private String content;

    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private Date createdDate;

    @ApiModelProperty(value = "評論人")
    private String createdBy;

    @ApiModelProperty(value = "當前評論下的子評論")
    private List<CommentTreeRespDto> childCommentList;
}
複製代碼
public List<CommentTreeRespDto> getComment(IdBean<String> id) {
        List<CommentTreeRespDto> comment = queryDao.executeForObjectList("selDiaComByDiaId", id);
        comment.forEach(c -> {
            comment.forEach(m -> {
                if (c.getId().equals(m.getParentId())) {
                    if (!CollectionUtils.isEmpty(c.getChildCommentList())) {
                        c.getChildCommentList().add(m);
                    } else {
                        List<CommentTreeRespDto> cs = Lists.newArrayList();
                        cs.add(m);
                        c.setChildCommentList(cs);
                    }
                }
            });
        });

        return comment.stream()
                .filter(e->(e.getParentId().equals(PARENT_ID)))
                .collect(Collectors.toList());
    }
複製代碼

我這種方式code

  1. 易於理解,雙層 for 循環比遞歸好理解點吧,利用集合的特性。
  2. 代碼簡潔,配合 Java8 Stream 流 + lambda 表達式,簡介易懂。
  3. 在完整樹的結構中,時間複雜度相同。雙層for循環的 n^2 + 過濾子節點的 n。

歡迎評論留言寫出你的想法。咱們一塊兒交流~orm


每一次成長,都想與你分享。(小聲BB,抽獎用的公衆號。)cdn

相關文章
相關標籤/搜索