Порядок сортировки ArrayList потерян странно, но почему? - PullRequest
0 голосов
/ 20 февраля 2020

Я создал простой объект класса POJO Person и два компаратора «compareByValue» и «compareByIndex» для сортировки класса ArrayList of Person. Я начинаю с сортировки ArrayList 'people' и выполняю небольшую операцию фильтрации внутри l oop некоторого другого массива. Для первого прохода все в порядке, но во втором проходе l oop немедленно теряется порядок «персон» Arraylist. что не так с моим кодом? единственная операция, выполняемая с использованием ArrayList 'people', - это вызов subArray, уничтожает ли он порядок списка?

class Result {
     static class Person
     {
        public Person(int index,int value){
            this.index=index;
            this.value=value;
        }

        int index;
        int value;

        public int getValue() {
            return value;
        }

        public int getIndex() {
            return index;
        }
    }

    public static Comparator<Person>compareByValue=new Comparator<Result.Person>()
    {
        @Override
        public int compare(Person o1, Person o2) {
            // TODO Auto-generated method stub
           return o1.getValue()-o2.getValue();
        }
    };
    public static Comparator<Person>compareByIndex=new Comparator<Result.Person>(){

        @Override
        public int compare(Person o1, Person o2) {

           return o1.getIndex()-o2.getIndex();
        }
    };

    public static int target(int targetValue,List<Person> persons)
    {
        int res=-1;
        int s=0;
        int  e=persons.size()-1;

        while(s<=e)
        {
            int m = (s+e)/2;
            if(persons.get(m).getValue()<targetValue){
                s=m+1;
            }else{
                res=m;
                e=m-1;
            }
        }
    return res;
}

public static List<Integer> kthPerson(int k, List<Integer> p, List<Integer> q) {

     List<Person> persons=new ArrayList<>();
    List<Integer> queryRes=new ArrayList<>();

     for(int j=0;j<q.size();j++){
         queryRes.add(0);
     }

     for(int j=0;j<p.size();j++)
     {
         Person person=new Person(j,p.get(j));
         persons.add(person);
     }

    persons.sort(compareByValue);

    for(int j=0;j<q.size();j++)
    {
         int targetIndex=target(q.get(j).intValue(), persons);
         if(targetIndex==-1){continue;}

         if(persons.size()-targetIndex>=k)
         {
             List<Person> targetPersons=persons.subList(targetIndex, persons.size());
             targetPersons.sort(compareByIndex);
             queryRes.set(j, targetPersons.get(k-1).getIndex()+1);
         }
     }
        return queryRes;
    }
}

1 Ответ

0 голосов
/ 20 февраля 2020

Метод subList() не меняет порядок, но также не возвращает новый список. Javado c:

Возвращает представление части этого списка между указанным fromIndex включительно и toIndex, исключительным. (Если fromIndex и toIndex равны, возвращаемый список пуст.) Возвращенный список поддерживается этим списком, поэтому неструктурные изменения в возвращенном списке отражаются в этом списке , и наоборот. ... (Структурные модификации - это изменения, которые изменяют размер этого списка или иным образом нарушают его таким образом, что выполняемые итерации могут привести к неверным результатам.)

Это означает, что если порядок в подгруппе список изменен, то же самое отражено в main списке. Если это не требуется, создайте копию возвращенного подсписка:

List<Person> targetPersons = new ArrayList(persons.subList(targetIndex, persons.size()));

Я не понял алгоритм кода, размещенного в вопросе, этот ответ основан в основном на тексте вопросов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...