根据其他列表的顺序对列表进行排序

2022-09-03 03:40:18

我需要对对象列表进行排序(,其中每个对象都有一些属性,例如(唯一),, ...等)。PersonList<Person>Personidnameage

排序顺序基于另一个列表。该列表包含一组 's(A 已排序)。PersonidList<String>

以与使用 Kotlin 或 Java 的列表相同的顺序对 进行排序的最佳方法是什么?List<Person>id

例:

List Person {
(“ID1”,”PERSON1”,22,..), (“ID-2”,”PERSON2”,20,..) ), (“ID-3”,”PERSON3”,19,..),…..
}

有序 ID 列表 :

List of ID {(“ID2”), (“ID1”),(”ID3”)….}

排序列表应为:Person

List PERSON {
 (“ID-2”,”PERSON 2”,20,..) ), (“ID1”,”PERSON 2”,22,..),  (“ID-3”,”PERSON 2”,19,..),…..
}

如果列表包含列表中未提及的任何 's,则这些值应位于排序列表的末尾。Personidid


编辑:这是我目前在Java中的方式。我希望有比这更好的方法:

public static List<Person> getSortList(List <Person> unsortedList, List<String> orderList){

    if(unsortedList!=null && !unsortedList.isEmpty() && orderList!=null && !orderList.isEmpty()){
        List sortedList = new ArrayList<OpenHABWidget>();
        for(String id : orderList){
            Person found= getPersonIfFound(unsortedList, id); // search for the item on the list by ID
            if(found!=null)sortedList.add(found);       // if found add to sorted list
            unsortedList.remove(found);        // remove added item
        }
        sortedList.addAll(unsortedList);        // append the reaming items on the unsorted list to new sorted list
        return sortedList;
    }
    else{
        return unsortedList;
    }

}

public static Person getPersonIfFound(List <Person> list, String key){
    for(Person person : list){
        if(person.getId().equals(key)){
            return person;
        }
    }
    return null;
}

答案 1

一个有效的解决方案是首先创建从(所需的 ID 顺序)中的 ID 到该列表中的索引的映射:ids

val orderById = ids.withIndex().associate { it.value to it.index }

然后按此映射中的顺序对列表进行排序:peopleid

val sortedPeople = people.sortedBy { orderById[it.id] }

注意:如果某人的 ID 不在 中,则他们将被放在列表的第一位。要将它们放在最后,可以使用 nullsLast 比较器:ids

val sortedPeople = people.sortedWith(compareBy(nullsLast<String>) { orderById[it.id] })

答案 2

我会做这样的事情(在伪代码中,因为我不知道你的代码是什么样子的)

listOfPersons = [{2,Bob},{3,Claire},{1,Alice}]
orderList = [1,3,2]
sortedList = []
for(id in orderList)
    person = listOfPersons.lookup(id)
    sortedList.add(person)  

如果你有一个地图(id-> person)而不是listOfPersons,那么查找会更容易。


推荐