java利用遞歸調(diào)用實(shí)現(xiàn)樹(shù)形菜單的樣式
一:需求
現(xiàn)有以需求就是把某一個(gè)帖子的全部評(píng)論展示出來(lái)。
二:分析
關(guān)于對(duì)帖子的評(píng)論分為主評(píng)論和子評(píng)論,主評(píng)論就是對(duì)帖子的直接評(píng)論,子評(píng)論就是對(duì)評(píng)論的評(píng)論。
三:思路
先獲取某一個(gè)帖子的全部主評(píng)論,遞歸判斷是否有子評(píng)論,獲取子評(píng)論。
遞歸本質(zhì):程序調(diào)用自身的編程技巧叫做遞歸。
程序調(diào)用自身的編程技巧稱為遞歸( recursion)。遞歸做為一種算法在程序設(shè)計(jì)語(yǔ)言中廣泛應(yīng)用。 一個(gè)過(guò)程或函數(shù)在其定義或說(shuō)明中有直接或間接調(diào)
用自身的一種方法,它通常把一個(gè)大型復(fù)雜的問(wèn)題層層轉(zhuǎn)化為一個(gè)與原問(wèn)題相似的規(guī)模較小的問(wèn)題來(lái)求解,遞歸策略只需少量的程序就可描述出解題過(guò)
程所需要的多次重復(fù)計(jì)算,大大地減少了程序的代碼量。遞歸的能力在于用有限的語(yǔ)句來(lái)定義對(duì)象的無(wú)限集合。
四:編碼
實(shí)體類:
import java.util.Date;
import java.util.List;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
@Data
public class BsChannelPostReply {
private long replyId;
private String niceName;
@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
private Date replyDate;
private String content;
private long directRepliedId;//回復(fù)的直接評(píng)論的replyId
private List<BsChannelPostReply> children;//下面的子評(píng)論
}
獲取主評(píng)論列表,和遞歸全部子評(píng)論:
@Override
@Datasource(value="community")//切換數(shù)據(jù)源
public List<BsChannelPostReply> getMainReply(int postId) {
// TODO Auto-generated method stub
List<BsChannelPostReply> listMain=dao.getMainReply(postId);//獲取主評(píng)論
if(listMain.size()>=0){//如果主評(píng)論不為空
for (BsChannelPostReply bsChannelPostReply : listMain) {
bsChannelPostReply.setChildren(getMainReplyChildren(bsChannelPostReply.getReplyId()));//加載子評(píng)論
}
}
return listMain;
}
@Override
@Datasource(value="community")//切換數(shù)據(jù)源
public List<BsChannelPostReply> getMainReplyChildren(long replyId) {
// TODO Auto-generated method stub
List<BsChannelPostReply> listChildren=dao.getMainReplyChildren(replyId);//根據(jù)當(dāng)前的replayId獲取當(dāng)前級(jí)子評(píng)論列表
if(listChildren.size()>=0){
for (BsChannelPostReply bsChannelPostReply : listChildren) {
bsChannelPostReply.setChildren(getMainReplyChildren(bsChannelPostReply.getReplyId()));//在判斷當(dāng)前子評(píng)論是否還有子評(píng)論,遞歸調(diào)用,直到?jīng)]有子評(píng)論
}
}
return listChildren;
}
五:效果
根據(jù)這樣的遞歸調(diào)用就可以實(shí)現(xiàn)理論上的獲取無(wú)極限的子評(píng)論列表。
慎用Java遞歸調(diào)用
在java語(yǔ)言中,使用遞歸調(diào)用時(shí),如果過(guò)多的調(diào)用容易造成java.lang.StackOverflowError即棧溢出和程序執(zhí)行過(guò)慢。這是一個(gè)潛在Bug和影響程序執(zhí)行效率問(wèn)題,需要謹(jǐn)慎使用。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
java后臺(tái)實(shí)現(xiàn)支付寶對(duì)賬功能的示例代碼
這篇文章主要介紹了java后臺(tái)實(shí)現(xiàn)支付寶對(duì)賬功能的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
Java class文件格式之訪問(wèn)標(biāo)志信息_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
access_flags 描述的是當(dāng)前類(或者接口)的訪問(wèn)修飾符, 如public, private等, 此外, 這里面還存在一個(gè)標(biāo)志位, 標(biāo)志當(dāng)前的額這個(gè)class描述的是類, 還是接口2017-06-06
使用 Java 類 實(shí)現(xiàn)Http協(xié)議
這篇文章主要介紹了用幾個(gè)Java類簡(jiǎn)單的實(shí)現(xiàn)了Http協(xié)議相關(guān)資料,感興趣的的朋友可以參考下面具體的文章內(nèi)容2021-09-09
spring aop execution表達(dá)式的用法
這篇文章主要介紹了spring aop execution表達(dá)式的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Spring實(shí)戰(zhàn)之緩存使用key操作示例
這篇文章主要介紹了Spring實(shí)戰(zhàn)之緩存使用key操作,結(jié)合實(shí)例形式分析了Spring緩存使用key具體配置、屬性、領(lǐng)域模型等相關(guān)操作技巧,需要的朋友可以參考下2020-01-01
淺談Spring Cloud zuul http請(qǐng)求轉(zhuǎn)發(fā)原理
這篇文章主要介紹了淺談Spring Cloud zuul http請(qǐng)求轉(zhuǎn)發(fā)原理,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-08-08
Jenkins如何實(shí)現(xiàn)自動(dòng)打包部署linux
這篇文章主要介紹了Jenkins如何實(shí)現(xiàn)自動(dòng)打包部署linux,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-11-11
Spring很常用的@Conditional注解的使用場(chǎng)景和源碼解析
今天要分享的是Spring的注解@Conditional,@Conditional是一個(gè)條件注解,它的作用是判斷Bean是否滿足條件,本文詳細(xì)介紹了@Conditional注解的使用場(chǎng)景和源碼,需要的朋友可以參考一下2023-04-04

