傳統用遞歸,先查出全部頂級父節點,再循環調用 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
歡迎評論留言寫出你的想法。咱們一塊兒交流~orm
每一次成長,都想與你分享。(小聲BB,抽獎用的公衆號。)cdn