获取列表中所有出现的索引

Cha*_*les 4 list filter kotlin

嘿,我正在寻找一个从列表中获取的函数:

[6, 54, 3, 6, 3] 
Run Code Online (Sandbox Code Playgroud)

以下列表:

[0, 3] 
Run Code Online (Sandbox Code Playgroud)

当我过滤 6 时。

到目前为止,我只找到了可以让我过滤第一次或最后一次出现的函数。

gid*_*dds 12

目前标准库中没有单独的函数来实现此目的,但很容易编写自己的函数,例如:

\n
fun <E> Iterable<E>.indexesOf(e: E)\n    = mapIndexedNotNull{ index, elem -> index.takeIf{ elem == e } }\n
Run Code Online (Sandbox Code Playgroud)\n

这适用于任何类型的任何列表、集合或其他可迭代对象,并返回List<Int>.\xe2\x80\x82 如果没有匹配项(例如,如果集合为空),则返回一个空列表。

\n

这里mapIndexedNotNull()转换元素,仅返回非空元素。\xe2\x80\x82 并takeIf()用于仅获取匹配元素的索引,其余部分返回 null(然后将被丢弃)。

\n

这应该是比较有效的;它对列表进行一次扫描,并仅创建一个包含结果的新列表。\xe2\x80\x82(如果临时对象是主要问题,您可能根本不会将匹配的索引存储在列表中,但只需用一些函数循环它们forEachMatchingIndex()即可。)

\n

(感谢迈克尔提出的最初想法。)

\n
\n

更新:为了完整性,这里的版本可以找到满足任何提供的函数的元素:

\n
inline fun <E> Iterable<E>.indexesOf(predicate: (E) -> Boolean)\n    = mapIndexedNotNull{ index, elem -> index.takeIf{ predicate(elem) } }\n
Run Code Online (Sandbox Code Playgroud)\n

您可以使用它来查找所有偶数的索引:

\n
listOf(1, 2, 3, 4, 5, 6).indexesOf{ it % 2 == 0 } // [1, 3, 5]\n
Run Code Online (Sandbox Code Playgroud)\n