List 获取列表中所有事件的索引
嘿,我想从列表中找到一个函数:List 获取列表中所有事件的索引,list,kotlin,filter,List,Kotlin,Filter,嘿,我想从列表中找到一个函数: [6, 54, 3, 6, 3] 下表: [0, 3] 当我在6号过滤时 到目前为止,我只找到了允许我在第一次或最后一次出现时进行筛选的函数。目前标准库中没有一个函数可以用于此目的,但编写自己的函数很容易,例如: fun <E> Iterable<E>.indexesOf(e: E) = mapIndexedNotNull{ index, elem -> index.takeIf{ elem == e } } fun
[6, 54, 3, 6, 3]
下表:
[0, 3]
当我在6号过滤时
到目前为止,我只找到了允许我在第一次或最后一次出现时进行筛选的函数。目前标准库中没有一个函数可以用于此目的,但编写自己的函数很容易,例如:
fun <E> Iterable<E>.indexesOf(e: E)
= mapIndexedNotNull{ index, elem -> index.takeIf{ elem == e } }
fun-Iterable.indexesOf(e:e)
=mapIndexedNotNull{index,elem->index.takeIf{elem==e}
这将适用于任何类型的列表、集合或其他iterable,并返回一个列表
。 如果没有匹配项(例如,如果集合为空),则返回空列表
这里转换元素,只返回非空的元素。 和仅用于获取匹配元素的索引,其余元素返回null(随后将被丢弃)
这应该是相对有效的;它对列表进行一次扫描,并仅创建一个包含结果的新列表。 (如果临时对象是一个主要问题,您可能根本不会将匹配索引存储在列表中,而只是使用一些forEachMatchingIndex()
函数来循环它们。)
(感谢Michael的最初想法。)可能有更有效的方法,但这应该是可行的:
fun List.indicatesof(i:Int)=mapIndexed{index,elem->if(elem==i)index else-1}.filter{it!=-1}
@Michael,可以改进为:fun Iterable.indicatesof(i:Int)=mapIndexedNotNull{index,elem->index.takeIf{elem==i}
@Michael我们中的一个人应该发布一个关于这个的答案! 我会给你们优先权…:-)@gidds你们的版本更简单,所以继续吧。谢谢你们!很棒的建议!