美文网首页
List中元素置顶

List中元素置顶

作者: zxcvbnmzsedr | 来源:发表于2018-06-28 22:09 被阅读0次

    需求是这样:有一个回答列表,需要将这个回答列表中的最佳回答放置到数据的最前面。
    因为老项目的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);
                }
            }
    

    相关文章

      网友评论

          本文标题:List中元素置顶

          本文链接:https://www.haomeiwen.com/subject/cmonyftx.html