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

Tic*_*haz 2 kotlin

这是列表的示例。我想让动态,也许价值会变得更多。

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)

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

Jof*_*rey 5

我认为您正在寻找的术语是“频率”:元素在列表中出现的次数。

您通常可以使用如下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()` 可以替换为: `words.groupingBy { it }.eachCount()`。这样我们就可以避免创建值列表,而我们在这里并不真正需要它,相反,我们实际上只计算元素的数量。 (2认同)

Ale*_*exT 5

你可以这样使用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如果我是您,我会坚持下去。