Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 获取列表中所有事件的索引_List_Kotlin_Filter - Fatal编程技术网

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你们的版本更简单,所以继续吧。谢谢你们!很棒的建议!