此问题在此处已有答案:
Guava way of sorting List according to another list?(6个答案)
五年前就关门了。
我需要对Person
对象的列表进行排序(List<Person>
,其中每个Person
对象都有一些属性,如id
(唯一)、name
、age
等)。
排序顺序基于另一个列表。该列表包含一组Person
id
(已排序的List<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,..),…..
}
如果Person
列表包含id
列表中未提及的任何id
,则这些值应位于排序列表的末尾。
编辑:这是我目前在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;
}
4条答案
按热度按时间ruoxqz4g1#
一个有效的解决方案是首先创建从
ids
中的ID(您所需的ID顺序)到该列表中的索引的Map:然后按照
id
在这个Map中的顺序对people
列表进行排序:注意:如果人员的ID不在
ids
中,则会将其放在清单的最前面。若要将其放在最后,您可以使用nullsLast
比较器:vddsk6oq2#
我会这样做(用伪代码,因为我不知道你的代码是什么样子的)
如果你有一个map(id-〉person)而不是listOfPersons,查找会更容易。
a2mppw5e3#
请尝试以下代码。
现在,
outputList
将具有您所期望的值...00jrzges4#
以下代码将Person列表转换为
Map
,其中key是ID,value是Person对象本身。此Map
有助于快速查找。然后遍历ID列表,从Map
获取值,并将其添加到另一个List
。输出量