如何根据最高分组对对象列表进行排序?

时间:2018-05-09 17:35:25

标签: sorting kotlin

如果我有一个对象列表,我该如何根据最大的组对它们进行排序?

e.g。我把这个csv读到了一个对象列表

FirstName, LastName, Age
Michael, Moore, 64
John, Doe, 22
John, Brown, 44
Peter, Piper, 46
John, Johnson, 14
Peter, Rabbit, 5

如果我按FirstName分组,我会

FirstName, Count
Michael, 1
John, 3
Peter, 2

如果我按计数降序排序

FirstName, Count
John, 3
Peter, 2
Michael, 1

我现在如何按此排序组的顺序对第一个列表进行排序?

FirstName, LastName, Age
John, Doe, 22
John, Brown, 44
John, Johnson, 14
Peter, Piper, 46
Peter, Rabbit, 5
Michael, Moore, 64

到目前为止,我有:

val people: List<Person> = readNames(csv)
val group = positions.groupingBy { it.firstName }.eachCount()
val sorted = group.toList().sortedByDescending { (key, value) -> value }

2 个答案:

答案 0 :(得分:0)

分组后,名字已成为该名称在排序列表中重要性的关键。

?- bagof(F2,N^(N in 0..3, friend_of_maxdist(a,F2,N), label([N])),L).
L = [b, b, b, b2, b2, b2, b3, b3, b3|...].

您还可以按名字出现的频率对人员列表进行排序,但操作会更重,因为对每个项目执行计数而不是一次性通过分组进行计数。

people.sortedByDescending { group[it.firstName] }

答案 1 :(得分:0)

创建您的eachCount地图,其中包含每个具有相关出现次数的名称。然后按原先确定的计数对原始数组进行排序:

val sorted = ps.groupingBy { it.fn }.eachCount().let { counts ->
    ps.sortedByDescending { counts[it.fn] }
}