这里是列表的例子。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
如果我增加更多的价值,那么结果也会增加。
3wabscal1#
可以按以下方式使用groupBy:
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。
.mapValues()
.toMap()
Map<String, Int>
Int
list
result
add
ArrayList
MutableList
swvgeqrz2#
我想你要找的术语应该是“频率”元素在列表中出现的次数。通常可以使用count方法计算列表中的元素,如下所示:
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方法:
freqs
Map
Map<String, List<String>>
mapValues
Grouping
eachCount
val freqs = list.groupingBy { it }.eachCount()
2条答案
按热度按时间3wabscal1#
可以按以下方式使用
groupBy
:Jeoffrey's方式实际上更好,因为他直接使用
.mapValues()
,而不是额外调用.toMap()
。我只是把这个答案留给她,因为我相信我放的其他信息是相关的。这将给予
Map<String, Int>
,其中Int
是出现次数。当你改变原始的
list
时,这个result
不会改变。这不是语言的工作方式。如果你想要这样的东西,你需要做很多工作,比如覆盖你的集合中的add
函数来刷新result
Map。另外,我看不出您有什么理由使用
ArrayList
,特别是因为您希望增加该集合的大小,如果我是您,我会坚持使用MutableList
。swvgeqrz2#
我想你要找的术语应该是“频率”元素在列表中出现的次数。
通常可以使用
count
方法计算列表中的元素,如下所示:但是,如果需要计算所有元素的数量,这种方法的效率非常低,在这种情况下,可以通过以下方式创建频率图:
freqs
在这里将是Map
,其中每个键是来自原始列表的唯一元素,并且值是该元素在列表中的对应频率。首先通过
groupBy
将彼此相等的元素分组,groupBy
返回一个Map<String, List<String>>
,其中每个键都是原始列表中的唯一元素,每个值都是列表中与键相等的所有元素的组,然后mapValues
将转换该Map,使值为组的大小,而不是组本身的大小。@broot建议的一种改进方法是使用Kotlin的
Grouping
类,该类有一个内置的eachCount
方法: