Spring Boot中利用遞迴演算法查詢到所有下級使用者,並手動進行分頁
阿新 • • 發佈:2019-01-03
Spring Boot中利用遞迴演算法查詢到所有下級使用者,並手動進行分頁
前提:語言用的是kotlin(和Java一樣,但更簡潔),寫下這篇文章用來記錄程式設計過程中遇到的一些難點
1、功能需求
前端使用者A點選“我的推薦”後,呼叫後臺的介面,查詢到所有的下家(不僅包括直接下家)
如圖所示,當前使用者A要查詢所有下家使用者,就是以自己為樹的“根”節點,遍歷所有下家使用者,並返回所有下家的ID和使用者名稱。
2、程式碼實現
//我的推薦 fun queryLower(request: QueryLowerRequestModel,userToken: UserToken): PageData2<QueryLowerResponseModel> { //建立一個list,用於儲存遞迴後的返回 var mutableList = mutableListOf<String>() GetMyRecommend(userToken.userId!!,mutableList) var responseList = mutableListOf<QueryLowerResponseModel>() var userAsset = assetRepository.findAll() for(i in mutableList) { userAsset.forEach { e -> if (e.username == i) { responseList.add(QueryLowerResponseModel( userName = i, baseMoney = e.base_money, create_time = e.base_money_time, isDirect = 0 )) } } } var toIndex = (request.pageNo+1)*request.size-1 if( (request.pageNo+1)*request.size > mutableList.size) { toIndex = mutableList.size } var totalPages :Int = (mutableList.size / request.size)+1 return PageData2( list = responseList.subList(request.pageNo*request.size,toIndex), totalNum = mutableList.size.toLong(), pageNo = request.pageNo, totalPages = totalPages, hasMore = false ) }
其中的GetMyRecommend函式是我自定義的一個遞迴函式,函式體如下:
//遞迴獲取我的推薦 fun GetMyRecommend(id:Long ,nameList:MutableList<String> ) { var userList = usersRepository.selectLowerUsers(id) if(userList.isEmpty()) { return } else { for( i in userList) { nameList.add(i) var userId = usersRepository.findUserEntityByUsername(i) GetMyRecommend(userId.id,nameList) } } }
可以看到,在遞迴過程中,每次我都進行了資料庫的操作,雖然這樣的效率很低,但在敏捷開發過程中,首要的任務就是將功能實現,其次再考慮效能的問題。這個遞迴我利用了list傳地址的特性,每次對list操作都會改變list中的值,這樣就記錄下來了所有下家。其次進行分頁(分頁是基礎操作),並返還給前端。