在Kotlin中创建属性到对象的地图

时间:2018-02-20 18:58:29

标签: kotlin

请考虑以下事项:

data class Thing(val name: String, val attributes: List<String>)

鉴于List<Thing>我要创建一个属性StringList<Thing>的地图。从广义上讲,事物将按其各自的属性进行分组。

首先想到的是flatMapassociateBy的组合,但它们如何组合在一起并不完全清楚。

非常感谢任何帮助

2 个答案:

答案 0 :(得分:1)

给出Thing的列表:

val elements = listOf(
    Thing("First", listOf("A", "B")),
    Thing("Second", listOf("A", "B")),
    Thing("Third", listOf("A"))
)

您可以使用groupBy

fun List<Thing>.groupByAttributeAtIndex(attributeIndex: Int): Map<String?, List<Thing>> {
  return groupBy { it.attributes.getOrNull(attributeIndex) }
}

按索引属性分组,例如val grouped = elements.groupByAttributeAtIndex(1)会导致Map

{
    B=[Thing(name=First, attributes=[A, B]), Thing(name=Second, attributes=[A, B])], 
    null=[Thing(name=Third, attributes=[A])]
}

答案 1 :(得分:1)

您可以收集所有可用属性,然后使用associate创建单个属性的Pair和具有相应属性的Thing。它将生成指定的地图。

val things = listOf(
    Thing("first", listOf("a1", "a3")),
    Thing("second", listOf("a2", "a3", "a4"))
)
val result = things
    .flatMap { it.attributes }
    .associate { att ->
        att to things.filter { it.attributes.contains(att) }
    }

结果如下:

a1=[Thing(name=first, attributes=[a1, a3])], 
a3=[Thing(name=first, attributes=[a1, a3]), Thing(name=second, attributes=[a2, a3, a4])], 
a2=[Thing(name=second, attributes=[a2, a3, a4])], 
a4=[Thing(name=second, attributes=[a2, a3, a4])]