Kotlin - индекс дублированных элементов в массиве - PullRequest
2 голосов
/ 05 апреля 2020

Есть ли простой способ получить индекс соответствующих элементов в массиве, не записывая a для l oop, а затем собирая индекс?

Eg: val arr = arrayOf<Int>(2,3,4,2,5,2,6,3,2)

Output: For element 2, output should be (0,3,5,8) and For element 3, output should be (1,7)

Kotlin предоставляет indexOf (элемент), который возвращает первый индекс, а затем lastIndexOf (элемент), который даст мне последний индекс. Ищу простой способ получить индексы всех соответствующих элементов.

Мое решение: Стандартное решение итерации по массиву и сбора индекса.

var indexArrOf2 = mutableListOf<Int>()
var indexArrOf3 = mutableListOf<Int>()
for(i in arr.indices) {
  if (arr[i] == 2) {
    indexArrOf2.add(i)
  }
  if (arr[i] == 3) {
    indexArrOf3.add(i)
  }
}

Ответы [ 3 ]

6 голосов
/ 05 апреля 2020

Да, вы можете использовать mapIndexedNotNull:

arr.mapIndexedNotNull { index, elem -> if (elem == 2) index else null }
0 голосов
/ 06 апреля 2020

Немного запутанный, но возвращает карту Map<Element, List<Indices>> для использования по желанию.

arr.mapIndexed { index, i -> i to index  }   //List<Pair<Int, Int>> - [(2, 0), (3, 1), (4, 2), (2, 3), (5, 4), (2, 5), (6, 6), (3, 7), (2, 8)]
.groupBy { it.first }   //Map<Int, List<Pair<Int, Int>>> - {2=[(2, 0), (2, 3), (2, 5), (2, 8)], 3=[(3, 1), (3, 7)], 4=[(4, 2)], 5=[(5, 4)], 6=[(6, 6)]} 
.mapValues { it.value.map { it.second } }   //Map<Int, List<Int>> - {2=[0, 3, 5, 8], 3=[1, 7], 4=[2], 5=[4], 6=[6]}
0 голосов
/ 05 апреля 2020

Я бы использовал функцию расширения withIndex(), чтобы добавить индекс. Затем вы можете выбрать соответствующие элементы и получить их индексы:

val arr = arrayOf(2, 3, 4, 2, 5, 2, 6, 3, 2)

println(arr.withIndex().filter{ it.value == 2 }.map{ it.index })
// prints '[0, 3, 5, 8]'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...