请考虑以下事项:
data class Thing(val name: String, val attributes: List<String>)
鉴于List<Thing>
我要创建一个属性String
到List<Thing>
的地图。从广义上讲,事物将按其各自的属性进行分组。
首先想到的是flatMap
与associateBy
的组合,但它们如何组合在一起并不完全清楚。
非常感谢任何帮助
答案 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])]