一個(gè)排名調(diào)整問(wèn)題惡心了我整整一天
問(wèn)題回顧

在招投標(biāo)行業(yè),某個(gè)項(xiàng)目的某個(gè)標(biāo)段會(huì)有多家投標(biāo)人來(lái)投標(biāo).為了選出中標(biāo)企業(yè),會(huì)組織專家對(duì)投標(biāo)人進(jìn)行評(píng)審,在最后階段,如果有特殊原因允許對(duì)投標(biāo)人排名進(jìn)行臨時(shí)調(diào)整
如上圖所示,我們可以點(diǎn)擊排名按鈕,在彈框中選擇期望的排名,對(duì)投標(biāo)人排名進(jìn)行調(diào)整;
問(wèn)題分析
🙌場(chǎng)景一
假如我們將第一名調(diào)整為第二名,那么第二名和第一名要對(duì)調(diào)位置,第三名保持不變,最終變?yōu)橛覀?cè)順序
🙌場(chǎng)景二
假如我們把第三名調(diào)整為第一名,那么原來(lái)的第一名和第二名的排名要遞減1,最終變?yōu)橛覀?cè)順序
🤦♀️以我淺薄的知識(shí),感覺(jué)這個(gè)問(wèn)題很棘手
剛開(kāi)始我想我需要先把原來(lái)的排名查詢出來(lái),然后分上面兩種情況去判斷,進(jìn)而獲取各個(gè)元素的新排名,在建立舊排名和新排名的關(guān)聯(lián),然后通過(guò)這個(gè)關(guān)聯(lián)關(guān)系達(dá)到更新數(shù)據(jù)庫(kù)的目的
雖然這樣也可以做,但我最近放棄了這種方式,采用引入鏈表來(lái)實(shí)現(xiàn),下面來(lái)一起看看
解決方案
- HashMap<String, Object> params = new HashMap<>();
- params.put("projectId", bidder.getProjectId());
- params.put("sectionId", bidder.getSectionId());
- LinkedList<Integer> temp = new LinkedList<>();
- //查詢當(dāng)前所有投標(biāo)人排名
- LinkedList<Bidder> ranks = this.selectBidderRanking(bidder);
- //將所有企業(yè)舊排名先放入鏈表中
- ranks.forEach(i -> {
- temp.add(i.getBidderId());
- });
- //移除當(dāng)前元素[就是跳轉(zhuǎn)排名的那個(gè)企業(yè)]
- temp.remove(bidder.getBidderId());
- //指定位置插入元素[以新排名為位置,重新插入那個(gè)企業(yè)]
- temp.add(Integer.parseInt(bidder.getRank()) - 1, bidder.getBidderId());
- //更新排名
- for (int i = 0; i < temp.size(); i++) {
- bidder.setBidderId(temp.get(i));
- bidder.setRank(String.valueOf(i + 1));
- bidderMapper.updateBidderRank(bidder);
- }
在我們剛剛分析的過(guò)程中,其實(shí)最麻煩的地方就是一個(gè)企業(yè)排名變化以后,其他的都要跟著變化,通過(guò)利用鏈表,我們只需要關(guān)注他的新排名,對(duì)應(yīng)其他元素的升降已經(jīng)由鏈表幫我們處理好,我們只需要重新遍歷,就可以獲取到新的排名。