这是列表的示例。我想让动态,也许价值会变得更多。
val list = arrayListOf("A", "B", "C", "A", "A", "B") //Maybe they will be more
Run Code Online (Sandbox Code Playgroud)
我想要这样的输出:-
val result = list[i] + " size: " + list[i].size
Run Code Online (Sandbox Code Playgroud)
所以输出将显示每个字符串的大小。
A size: 3
B size: 2
C size: 1
Run Code Online (Sandbox Code Playgroud)
如果我增加更多的价值,那么结果也会增加。
我认为您正在寻找的术语是“频率”:元素在列表中出现的次数。
您通常可以使用如下count方法计算列表中的元素:
val numberOfAs = list.count { it == "A" }
Run Code Online (Sandbox Code Playgroud)
如果您需要计算所有元素,这种方法效率很低,在这种情况下,您可以通过以下方式创建频率图:
val freqs = list.groupBy { it }.mapValues { (_, g) -> g.size }
Run Code Online (Sandbox Code Playgroud)
freqs这里将是一个Map,其中每个键都是来自原始列表的唯一元素,值是该元素在列表中的对应频率。
这首先通过 对彼此相等的元素进行分组groupBy,它返回 aMap<String, List<String>>其中每个键是原始列表中的唯一元素,每个值是列表中与键相等的所有元素的组。然后mapValues将转换该映射,以便值是组的大小而不是组本身。
正如@broot 所建议的,一种改进的方法是使用 Kotlin 的Grouping具有内置eachCount方法的类:
val freqs = list.groupingBy { it }.eachCount()
Run Code Online (Sandbox Code Playgroud)
你可以这样使用groupBy:
val result = list.groupBy { it }.map { it.key to it.value.size }.toMap()
Run Code Online (Sandbox Code Playgroud)
Jeoffrey 的方法实际上更好,因为他.mapValues()直接使用,而不是额外调用.toMap(). 我只是把这个答案留给她,因为我相信我提供的其他信息是相关的。
这将给出 a Map<String, Int>,其中Int是出现次数。
这result时候你改变原来不会改变list。这不是语言的工作方式。如果你想要这样的东西,你需要做很多工作,比如add从你的集合中覆盖函数来刷新result地图。
此外,我认为您没有理由使用ArrayList,尤其是因为您希望增加该集合的大小,MutableList如果我是您,我会坚持下去。
| 归档时间: |
|
| 查看次数: |
55 次 |
| 最近记录: |