需求是这样:有一个回答列表,需要将这个回答列表中的最佳回答放置到数据的最前面。
因为老项目的sql编写的异常的复杂,很难直接从sql直接对回答列表进行排序,所以退而求其次从查询出的结果集入手。
问题抽象出来就是将数组中有特定标识的元素放到数据的最前面。
直接根据需求最简单的方法是再查一遍数据库,查询出最佳回答放到最前面。
// 回答列表中直接查询出最佳的回答
List<AnswerBean> as = queryBestAnswer(。。。。);
if (as != null && as.size() > 0) {
// 由于最佳回答数暂时只有一个,所以取出第一个作为要插入最佳回答
AnswerBean answerBean = as.get(0);
// 如果先前查询出来的结果集(answerBeans)包含了这个最佳回答,还需要将这个最佳回答删除(bestFlg标识它是否为最佳回答)
Iterator<AnswerBean> iterator = answerBeans.iterator();
while (iterator.hasNext()) {
AnswerBean it = iterator.next();
if (it.getBestFlg()) {
iterator.remove();
}
}
// 先把它加到末尾,防止set的时候出现空指针
answerBeans.add(answerBean);
// 移位,每个元素向后移一位
for(int i = answerBeans.size() -1 ; i > 0;i--){
answerBeans.set(i, answerBeans.get(i - 1));
}
// 然后将第0位设置成最佳答案即可
answerBeans.set(0, answerBean);
}
最后处理出来的answerBeans就是最后结果。
这个代码还需要进一步优化,原来的集合中既然都有最佳了为啥还要把它删了再处理一遍。
// 如果先前查询出来的结果集(answerBeans)包含了这个最佳回答,还需要将这个最佳回答删除
Iterator<AnswerBean> iterator = answerBeans.iterator();
int position = -1;
while (iterator.hasNext()) {
AnswerBean it = iterator.next();
position++;
if (it.getBestFlg()) {
break;
}
}
// 如果position不为0那么也就说原来的回答中包含了最佳回答
if(position != -1){
AnswerBean answerBean = answerBeans.get(position);
// 移位,每个元素向后移一位,移到position
for(int i = position; i > 0;i--){
answerBeans.set(i, answerBeans.get(i - 1));
}
// 然后将第0位设置成最佳答案即可
answerBeans.set(0, answerBean);
}else{
// 回答列表中直接查询出最佳的回答
List<AnswerBean> as = queryBestAnswer(。。。。);
if (as != null && as.size() > 0) {
// 由于最佳回答数暂时只有一个,所以取出第一个作为要插入最佳回答
AnswerBean answerBean = as.get(0);
// 先把它加到末尾,防止set的时候出现空指针
answerBeans.add(answerBean);
// 移位,每个元素向后移一位
for(int i = answerBeans.size() -1 ; i > 0;i--){
answerBeans.set(i, answerBeans.get(i - 1));
}
// 然后将第0位设置成最佳答案即可
answerBeans.set(0, answerBean);
}
}
如果要是说需求突然改了最佳回答要有多个,那么这个代码还是有很多问题的,继续改。
[图片上传失败...(image-4867e0-1530194988117)]
// 如果先前查询出来的结果集(answerBeans)包含了这个最佳回答,还需要将这个最佳回答删除
Iterator<AnswerBean> iterator = answerBeans.iterator();
List<Integer> positions = new ArrayList<>();
int position = -1;
while (iterator.hasNext()) {
AnswerBean it = iterator.next();
position++;
if (it.getBest()) {
positions.add(position);
break;
}
}
// 如果position不为0那么也就说原来的回答中包含了最佳回答
if(position != -1){
AnswerBean answerBean = answerBeans.get(position);
// 这个时候就不能直接移动到position,因为要保持回答有序,所以说要从最小的位置开始,借助插入排序的思想
int j = 0;
for(Integer p:positions){
// 移位,每个元素向后移一位,移到position
for(int i = p; i > 0;i--){
answerBeans.set(i, answerBeans.get(i - 1));
}
// 然后将第i位设置成最佳答案即可
answerBeans.set(j++, answerBean);
}
}else{
// 回答列表中直接查询出最佳的回答
List<AnswerBean> as = queryBestAnswer(doctorId, sequence, questionId);
if (as != null && as.size() > 0) {
// 先把它加到末尾
answerBeans.addAll(as);
// 移位,每个元素向后移as.size()位
for(int i = answerBeans.size() -1 ; i > 0;i--){
answerBeans.set(i, answerBeans.get(i - as.size()));
}
// 然后将第0位设置成最佳答案即可
answerBeans.addAll(0, as);
}
}
网友评论