2

Могу ли я сделать указатель на объект в List, чтобы даже при сортировке, изменении List, по ссылке я мог получить изначально указанный объект?

Axifive
  • 1,865

2 Answers2

1
val list = mutableListOf("One", "Two", "Three")
val str = list[0]
list[0] = "Zero"

println(list) //[Zero, Two, Three]
println(str)  //One

Элементарно :)

  • Я имел ввиду не копию объекта, а ссылку на него. Т.е в данном примере, я бы хотел получить str "Zero" – Aksenov Vladimir Mar 19 '18 at 16:09
  • Простите, а как понимать "получить изначально указанный объект"? – Eugene Krivenja Mar 19 '18 at 19:41
  • Я хочу получить изначально указанный объект, но что-то внутри объекта может измениться. Например у меня будет не строка, а какой-то класс. У меня все что угодно может внутри объекта поменяться и сам объект может куда угодно переместиться, но созданный мною указатель всеравно указывает на этот объект. А сейчас я создал просто копию – Aksenov Vladimir Mar 19 '18 at 20:00
  • 1
    Вы пытаетесь какие-то паттерны из С или С++ сюда притянуть. Это как-то все звучит странно для JVM языка. – Eugene Krivenja Mar 19 '18 at 21:12
  • Поэтому я и задал вопрос могу ли я это сделать:) – Aksenov Vladimir Mar 19 '18 at 21:18
  • "объект может куда угодно переместиться" -- это для JVM уже другой обьект. Задайте лучше новый вопрос с кодом, который должен решать что вы хотите, посмотрим. – Eugene Krivenja Mar 19 '18 at 21:27
  • Хорошо. Спасибо! – Aksenov Vladimir Mar 19 '18 at 21:32
0

В kotlin для этого есть прекрасный метод - withIndex()

Достаточно применить его на коллекции и каждый её элемент станет IndexedValue. У него есть .value и .index, так что теперь как бы вы не перемещали этот объект, вы всегда сможете найти его по первоначальному индексу.

Код:

fun main() {
    var list = listOf("One", "Two", "Zero").withIndex()
    list = list.reversed()
    println(list.find { it.index == 0 })
}

Вывод:

IndexedValue(index=0, value=One)

После изменения списка всё ещё с лёгкостью можно найти элемент, который изначально имел индекс [0], полагаю, что данное решение является тем самым указателем, о котором вы спрашивали.

Danil
  • 98