Kotlin группировка, отображение и т. Д. - PullRequest
0 голосов
/ 06 февраля 2020

Я знаю, что многие из этих тем существуют, но я совсем не понимаю эту тему c. И точное объяснение того, что происходит для новичка, необходимо.

У меня есть список людей:

    val person1 = Person("A", 8, 24,"darts")
    val person2 = Person("A", 8, 24,"football")
    val person3 = Person("A", 2, 24,"basketball")
    val person4 = Person("B", 8, 24,"skiing")
    val person5 = Person("B", 1, 24,"snowboard")

где

data class Person (val street: String, val number: Int, val age: Int, val hobby: String){
    override fun toString(): String {
        return "$street $number $age $hobby"
    }
}

А теперь подведем итоги вверх. Если я использую groupBy, результатом будет Map с ключом и значениями. Я прав? Где ключи - это атрибуты, по которым я группирую, например:

var grouping = list.groupBy { it.street }

результат:

{A=[A 8 24 darts, A 8 24 football, A 2 24 basketball], B=[B 8 24 skiing, B 1 24 snowboard]}

А теперь я бы нравится группировать по нескольким полям, таким как улица и номер. Как это сделать? И более того, я хотел бы указать СПИСОК (я должен сделать какую-то проекцию из этой карты?) Хобби, которые люди имеют по адресам и номерам. Например, под адресом A номер 8 у меня есть список (дартс, футбол).

@ Edit. Нужно ли как-то делить этот список на 2-й класс объектов?

1 Ответ

2 голосов
/ 06 февраля 2020

Да, groupBy возвращает карту, где ключи - это то, что было возвращено лямбда-значением, а значения - это списки элементов из исходного списка.

Для группировки по паре вещей необходимо возможность иметь ключ, который представляет все эти вещи и быть уникальным. Вероятно, это означает, что другой класс данных, или, возможно, вы могли бы объединить в виде строки.

data class Address(val street: String, val number: Int)

val grouping = list.groupBy { Address(it.street, it.number) }

И чтобы сделать значения карты просто хобби, вы можете использовать mapkeys:

val addressesToHobbies = grouping.mapKeys { it.map(Person::hobby) }
...