Я создал простой объект класса 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;
}
}