Как мы можем разбить пару (setOf (item), Double) на пару (item, double) со всеми возможными комбинациями? - PullRequest
0 голосов
/ 11 января 2019

Как мы можем деконструировать пару (SetOf (вещь), Double) для всех возможных комбинаций пары (вещь, двойка)?

Привет! Я пытаюсь изучить kotlin, и я борюсь с использованием функциональной части программирования. Особенно с лямбда-функциями и их использованием в коллекциях.

fun testTeam(): Set<TeamStats>{
    val team1: TeamStats=(TeamStats(team(1), setOf(player(1)),3))
    val team2: TeamStats=(TeamStats(team(1),players(1..2),5))
    val bunchOfTeams: Set<TeamStats> = setOf(team1,team2)
    return (bunchOfTeams)
}


fun main (args: Array<String>){
    val newTeam: Set<TeamStats> = testTeam()
    val decomposition = newTeam.map { Pair(it.Striker,it.Goals) }
    println("Stats: $decomposition")
}

Я получил такой результат:

Screenshot of the current state

/Library/Java/JavaVirtualMachines/jdk1.8.0_181.jdk....

Stats: [([Striker(name=Player 1)], 3), ([Striker(name=Player 1), Striker(name=Player 2)], 5)]

И я бы хотел получить следующее:

Stats: [([Striker(name=Player 1)], 3), ([Striker(name=Player 1),5) ,([Striker(name=Player 2)], 5)]

Может быть, есть лучший способ получить эту информацию, пожалуйста, предложите! Еще раз спасибо.

Ответы [ 2 ]

0 голосов
/ 11 января 2019

Из того, что я понимаю из вашего кода, он должен работать с использованием flatMap, например ::

newTeam.asSequence().flatMap { stats ->
  stats.Striker.asSequence().map {
    it to stats.Goals // just a convenience extension function to simplify writing Pair(it, stats.Goals)
  }
}

При условии следующих data classes и вспомогательных функций:

data class TeamStats(val team : Team, val Striker: Set<Striker>, val Goals : Int?)
data class Team(val i : Int)
data class Striker(val name : String)
fun player(i : Int) = Striker("Player $i")
fun team(i : Int) = Team(i)
fun players(i : IntRange) = i.asSequence().map(::player).toSet()

В качестве альтернативы вышеприведенному (и с показанным классом TeamStats), вы также можете использовать деструктурирование следующим образом:

newTeam.asSequence().flatMap { (_, strikers, goals) ->
  strikers.asSequence().map {
    it to goals
  }
}

, который даст следующий результат:

Stats: [(Striker(name=Player 1), 3), (Striker(name=Player 1), 5), (Striker(name=Player 2), 5)]

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

newTeam.flatMap { (_, strikers, goals) ->
  strikers.map {
    it to goals
  }
}
0 голосов
/ 11 января 2019

Вам нужно map внутренний Set<T> с помощью функции F: (T) -> Pair<T, Double>.

Пример

fun main(args: Array<String>) {
    val (set, value) = Pair(setOf(1, 2, 3, 4, 5), 1.0)
    val result = set.map { it to value }.toSet()

    check(result == setOf(1 to 1.0, 2 to 1.0, 3 to 1.0, 4 to 1.0, 5 to 1.0))
    println(result)
}

Выход

[(1, 1.0), (2, 1.0), (3, 1.0), (4, 1.0), (5, 1.0)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...