问题回顾

在招投标行业,某个项目的某个标段会有多家投标人来投标.为了选出中标企业,会组织专家对投标人进行评审,在最后阶段,如果有特殊原因允许对投标人排名进行临时调整
如上图所示,我们可以点击排名按钮,在弹框中选择期望的排名,对投标人排名进行调整;
问题分析
🙌场景一
假如我们将第一名调整为第二名,那么第二名和第一名要对调位置,第三名保持不变,最终变为右侧顺序
🙌场景二
假如我们把第三名调整为第一名,那么原来的第一名和第二名的排名要递减1,最终变为右侧顺序
🤦♀️以我浅薄的知识,感觉这个问题很棘手
刚开始我想我需要先把原来的排名查询出来,然后分上面两种情况去判断,进而获取各个元素的新排名,在建立旧排名和新排名的关联,然后通过这个关联关系达到更新数据库的目的
虽然这样也可以做,但我最近放弃了这种方式,采用引入链表来实现,下面来一起看看
解决方案
HashMap<String, Object> params = new HashMap<>();
params.put("projectId", bidder.getProjectId());
params.put("sectionId", bidder.getSectionId());
LinkedList<Integer> temp = new LinkedList<>();
//查询当前所有投标人排名
LinkedList<Bidder> ranks = this.selectBidderRanking(bidder);
//将所有企业旧排名先放入链表中
ranks.forEach(i -> {
temp.add(i.getBidderId());
});
//移除当前元素[就是跳转排名的那个企业]
temp.remove(bidder.getBidderId());
//指定位置插入元素[以新排名为位置,重新插入那个企业]
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);
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
在我们刚刚分析的过程中,其实最麻烦的地方就是一个企业排名变化以后,其他的都要跟着变化,通过利用链表,我们只需要关注他的新排名,对应其他元素的升降已经由链表帮我们处理好,我们只需要重新遍历,就可以获取到新的排名。