Сопоставить значение с каждым значением из набора

#kotlin #functional-programming

#kotlin #функциональное программирование

Вопрос:

Допустим, у меня есть классы:

 class SomeClass(
        val name: String
)

data class MyClass (
        val setValues: Set<SomeClass>,
        val intValue: Int
)
 

Затем я создаю набор следующим образом:

 val someClass1 = SomeClass("a")
val someClass2 = SomeClass("b")
val someClass3 = SomeClass("c")
val someClass4 = SomeClass("d")
val someClass5 = SomeClass("e")
val someClass6 = SomeClass("f")

val val1 = MyClass(setOf(someClass1, someClass2, someClass3), 1)
val val2 = MyClass(setOf(someClass1, someClass4, someClass5), 2)
val val3 = MyClass(setOf(someClass4, someClass5, someClass6), 3)

val setOfMyClass = setOf(val1, val2, val3)

 

и я хочу выполнить некоторые операции с этим набором setOfMyClass , например

val result = set. ...

и в результате получаем сопоставление следующим образом:

 someClass1 to 1
someClass2 to 1
someClass3 to 1
someClass1 to 2
someClass4 to 2
someClass5 to 2
someClass4 to 3
someClass5 to 3
someClass6 to 3
 

вероятно, это должен быть какой-то список.

Ответ №1:

У вас есть a Set<MyClass> , каждый из которых содержит a Set<SomeClass> . Обычно решением является сопоставление коллекции коллекций в одну коллекцию flatMap . В вашем примере объединение flatMap во внешнем наборе и map во внутреннем наборе дает вам список сопоставленных пар.

Это дает вам List<Pair<SomeClass, Int>> — что, вероятно, то, что вы хотите?

 val result = setOfMyClass.flatMap { myObject ->
    myObject.setValues.map { it to myObject.intValue }
}
 

Или, если вы хотите, чтобы это было как a Map<SomeClass, Int> , просто сделайте то же самое, что и выше, и:

 result.toMap()
 

Ответ №2:

Если я понимаю ваш вопрос, решением будет: setValues.AssociateWith { intValue }, который вернет Map<SomeClass, Int>

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

1. Я начинаю с a Set<MyClass> и хочу сделать это для всех наборов (setValues) из этого основного набора.

Ответ №3:

Я не уверен, понял ли я ваш вопрос, но я попробую.

Допустим, SomeClass был Int, и вы хотите вычислить intValue x для каждого элемента x из setValues.

В этом случае вы бы выполнили и получили список результатов. myClassObject.setValues.map{Pair(it, myClassObject.intValue)} Результатом является список, а не набор, потому что некоторые результаты могут появляться несколько раз (поскольку отображение не обязательно должно быть инъективным), и множество элементов теряется в наборе.