List中元素置顶

需求是这样:有一个回答列表,需要将这个回答列表中的最佳回答放置到数据的最前面。
因为老项目的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);
            }
        }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。