Поиск элемента в массивах Kotlin возвращает значение null

#android #kotlin

#Android #Kotlin

Вопрос:

У меня есть этот класс

 class Product(val price: BigDecimal, val tag: String)
  

Затем я добавляю элементы в этот класс

  var products = ArrayList<Product>()

 for (i in 1..5) {
     products.add(Product((0.25 * i).toBigDecimal(), i.toString()))
 }
  

Теперь я могу просматривать элементы следующим образом

 products.forEach {
    Log.d("xxx", "price: ${it.price} tag: ${it.tag}")
}
  

Результаты:

 D/xxx: price: 0.25 tag: 1
D/xxx: price: 0.5 tag: 2
D/xxx: price: 0.75 tag: 3
D/xxx: price: 1.0 tag: 4
D/xxx: price: 1.25 tag: 5
  

Что я пытаюсь сделать, так это найти «цена» с «тегом» = «3» в продуктах.
Я использую этот код, но он выдает меня null .

 var f = products.find { it.tag.equals('3') }
  

Есть идеи?

Ответ №1:

Ответ уже есть в вашем вопросе.

Вы пытаетесь сохранить тег как "tag" = "3" , но пытаетесь получить с it.tag.equals('3') помощью .

Просто вам нужно изменить свой код с помощью it.tag.equals("3")

Замените эту строку

 var f = products.find { it.tag.equals('3') }
  

с помощью этого

  var f = products.find { it.tag.equals("3") }
  

Ответ №2:

Проблема в том, что «3» и «3» разные. ‘3’ — это символ числа 3, а «3» — это строка, содержащая символ 3. equals Фактически, используя функцию, вы всегда получаете false в предикате из-за неравенства типов String и Char . Итак, если вы измените код следующим образом, проблема будет решена:

 var f = products.find { it.tag == "3" }
  

Обратите внимание, что == в kotlin есть операторная функция equals , которая упрощает чтение и запись.