Список списков GroupBy

#kotlin

Вопрос:

Как я могу успешно сделать что-то подобное?

 trips.groupBy { Passenger::name if Passenger in it.passengers} 
 

Я хочу изменить List<Trips> порядок, который должен List<Passengers> быть [PassengerA: List<Trips>, PassengerB:...]

Комментарии:

1. Нужно немного больше информации. Если в поездках есть список пассажиров, хотите ли вы создать новые списки поездок, в которых в списках пассажиров есть только один пассажир, поэтому имеет смысл связать их с одним пассажиром? Или вы хотите, чтобы каждый Пассажир был связан со списком поездок, участником которых он является, так что один и тот же экземпляр Поездки будет отображаться несколько раз на окончательной карте, поскольку он связан с несколькими разными пассажирами?

2. ответ ниже-95% от того, что мне было нужно, я просто забыл добавить некоторую информацию, которую я добавил в качестве комментария.

Ответ №1:

Если я правильно понял ваш вопрос, это может быть способ сделать то, что вы хотите:

 val passengersToTrips = trips
    .flatMap { trip ->
        // Associate every passenger in a trip to the trip: this results in a List<Pair<Passenger, Trip>>
        trip.passengers.map { passenger -> passenger to trip }
    }
    .groupBy(
        // Group using the passenger as key (use passenger.name in case the name should be the key)
        keySelector = { (passenger, _) -> passenger },
        // Extracting only the trip from the pair to transform from List<Pair<Passenger, Trip> into List<Trip> 
        valueTransform = { (_, trip) -> trip }
    )
 

Комментарии:

1. большое вам спасибо! это именно то, что мне нужно, но я упустил одну информацию. Как я могу также учитывать пассажиров, которые находятся в списке всех пассажиров, чтобы они также были включены в качестве пассажира:A : Пустой список() ? какой момент лучше использовать Passenger::name ? Я все еще учусь, извините за вопросы

2. Вы можете просто добавить на карту пассажиров, которых на ней нет: val withEmpty = passengersToTrips (allPassengers - passengersToTrips.keys).associateWith { emptyList() }

3. Мы также можем сделать это с помощью: allPassengers.associateWith { passengersToTrips[it] ?: emptyList() } .

4. большое всем спасибо. я только начинаю с kotlin (1 неделя), и этот стиль для меня очень труден. Любые рекомендации по книге будут высоко оценены, а также, что вы думаете об Атомарном Котлине?

5. @broot не могли бы вы немного объяснить, как это работает под капотом, я действительно не понимаю, как список allpassangers можно переставить на основе пассажиров в поездки[it]… так что я могу применить эту концепцию во многих сценариях