2015-02-19 4 views
4

Следующий код дает значение для -1 для индекса. Почему это?Weird result for Array.indexOf

val values = Array(1.0, 2.0, 3.0, Double.NaN, 4.0) 

val index = values.indexOf(Double.NaN) 
println(s"index = $index") 

Каков наилучший способ найти индекс NaN в этом сценарии? У меня есть следующее решение, но не думаю, что это самый элегантный.

val index2 = values.zipWithIndex.find(_._1.isNaN).get._2 
println(s"index2 = $index2") 

ответ

5

Это потому, что Double.NaN != Double.NaN.

Вы можете использовать indexWhere(p: (T) ⇒ Boolean): Int следующим образом:

val index = values.indexWhere(_.isNaN) 
+0

Это полезно. Спасибо за объяснение! – Saket

+0

Добро пожаловать. – aioobe

8

indexWhere, как indexOf, но позволяет обеспечить собственный предикат (который необходимо здесь с Double.NaN != Double.NaN):

scala> values.indexWhere(_.isNaN) 
res0: Int = 3 

Это будет немного более эффективно, чем ваше решение, и не генерирует исключения, если ни один из этих элементов не является NaN.