如何获取数组Kotlin中特定值的大小

tkclm6bt  于 2022-12-19  发布在  Kotlin
关注(0)|答案(2)|浏览(139)

这里是列表的例子。2我想使动态的地方,也许值会变得更多。

val list = arrayListOf("A", "B", "C", "A", "A", "B") //Maybe they will be more

我希望输出如下:-

val result = list[i] + " size: " + list[i].size

因此输出将显示大小为的每个String。

A size: 3
B size: 2
C size: 1

如果我增加更多的价值,那么结果也会增加。

3wabscal

3wabscal1#

可以按以下方式使用groupBy

val result = list.groupBy { it }.map { it.key to it.value.size }.toMap()

Jeoffrey's方式实际上更好,因为他直接使用.mapValues(),而不是额外调用.toMap()。我只是把这个答案留给她,因为我相信我放的其他信息是相关的。
这将给予Map<String, Int>,其中Int是出现次数。
当你改变原始的list时,这个result不会改变。这不是语言的工作方式。如果你想要这样的东西,你需要做很多工作,比如覆盖你的集合中的add函数来刷新resultMap。
另外,我看不出您有什么理由使用ArrayList,特别是因为您希望增加该集合的大小,如果我是您,我会坚持使用MutableList

swvgeqrz

swvgeqrz2#

我想你要找的术语应该是“频率”元素在列表中出现的次数。
通常可以使用count方法计算列表中的元素,如下所示:

val numberOfAs = list.count { it == "A" }

但是,如果需要计算所有元素的数量,这种方法的效率非常低,在这种情况下,可以通过以下方式创建频率图:

val freqs = list.groupBy { it }.mapValues { (_, g) -> g.size }

freqs在这里将是Map,其中每个键是来自原始列表的唯一元素,并且值是该元素在列表中的对应频率。
首先通过groupBy将彼此相等的元素分组,groupBy返回一个Map<String, List<String>>,其中每个键都是原始列表中的唯一元素,每个值都是列表中与键相等的所有元素的组,然后mapValues将转换该Map,使值为组的大小,而不是组本身的大小。
@broot建议的一种改进方法是使用Kotlin的Grouping类,该类有一个内置的eachCount方法:

val freqs = list.groupingBy { it }.eachCount()

相关问题