Android-сортировка списка не работает - PullRequest
0 голосов
/ 08 ноября 2011

У меня есть список с именем taskSubList, который состоит из объекта. Мне нужно отсортировать задачу на основе завершенной функции. Но список не сортируется. Мой код:

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 ]

4 голосов
/ 08 ноября 2011

Если вы пытаетесь реализовать сортировку самостоятельно, это хорошее упражнение, но почему бы не использовать Collections.sort()?

0 голосов
/ 09 ноября 2011

Теперь этот код работает !!.

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);
                    }
                }
            }
        }
    }
0 голосов
/ 08 ноября 2011

В вашем алгоритме сортировки есть ошибка. Когда вы перемещаете элемент completed в конец списка, текущий элемент (с индексом position) заменяется следующим элементом (из position+1). Но на следующей итерации первой увеличивается position, поэтому вы не обработали новый элемент (полученный из position+1).

Например, список:

(1 выполнено) (2 выполнено) (3 не завершено)

После первой итерации у вас будет:

(2 выполнено) (3 незавершено) (1 выполнено)

но следующая итерация начнется с элемента (3 incomplete), а элемент (2 completed) будет пропущен.

0 голосов
/ 08 ноября 2011

Я расскажу вам о недостатке, который я обнаружил в вашем алгоритме .., давайте предположим, что ваши первые 2 элемента выполнены, и вы смещаетесь вправо ... после 1-го цикла 2-й элемент занимает 1-ю позицию, которой вы не являетесь проверка еще раз .. так что она останется не отсортированной ..

попробуйте использовать следующий алгоритм ...

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 --;
            } 
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...