android-sorting of list无法正常工作

时间:2011-11-08 11:44:08

标签: java android sorting collections

我有一个名为taskSubList的列表,它由对象组成。我需要根据iscompleted函数对任务进行排序。但是列表没有排序。我的代码是:

if(taskSubList.size()!=0)
    {
        for(int position=0;position<taskSubList.size();position++)
        {
            if(taskSubList.get(position).isCompleted()==1)
            {
                Task taskItem = taskSubList.get(position);
                for (int i = position + 1; i < taskSubList.size();i++) {
                    Task taskItem1 = taskSubList.get(i);
                    taskSubList.set(i-1, taskItem1);
                }
            taskSubList.set(taskSubList.size()-1, taskItem);


            }
        }
    }   

4 个答案:

答案 0 :(得分:4)

如果您尝试自己实施排序,这是一个很好的练习,但为什么不使用Collections.sort()

答案 1 :(得分:0)

我会告诉你我在你的算法中发现的缺陷..,让我们假设你的前两个元素已经完成,你正在向右移动..在第一个循环后第二个元素到达第一个位置,你不是再次检查..所以它将保持未分类..

尝试使用以下算法...

if(taskSubList.size()!=0)
    {
        int completedCount = taskSubList.size() - 1;
        for(int position=0;position<taskSubList.size();position++)
        {
            if (position >= completedCount - 1) 
               break;
            if(taskSubList.get(position).isCompleted()==1) {
               // swap elements in position and completedCount
               completedCount--;
               position --;
            } 
        }
    }

答案 2 :(得分:0)

排序算法中存在错误。当您将completed元素移动到列表末尾时,当前元素(索引为position)将替换为下一个元素(来自position+1)。但是在第一次迭代中position递增,所以你没有处理新元素(来自position+1)。

例如,列表:

(1完成)(2完成)(3不完整)

在第一次迭代之后,您将拥有:

(2完成)(3不完整)(1完成)

但是下一次迭代将从元素(3 incomplete)开始,而元素(2 completed)将会被遗漏。

答案 3 :(得分:0)

现在这段代码可以工作!!。

if(taskSubList.size()!=0)
    {
        for(int position=0;position<taskSubList.size();position++)
        {
            if(taskSubList.get(position).isCompleted()==1)
            {
                for(int i=position+1;i<taskSubList.size();i++)
                {
                    if(taskSubList.get(i).isCompleted()==0)
                    {
                        Task taskItem = taskSubList.get(position);
                        Task taskItem1 = taskSubList.get(i);
                        taskSubList.set(i, taskItem);
                        taskSubList.set(position, taskItem1);
                    }
                }
            }
        }
    }