我在scala(2.11.8
和2.12.1
)中遇到了一些非常奇怪的排序行爲Seq[(Long, Double)]
。我可能誤解了一些根本性的東西。scala Seq sortWith or sortBy with NaNs
給定的順序沒有Double.NaN
值在它一切正常
Seq[(Long, Double)]((1L, 2.5D), (2L, 0D), (11L, 11D), (2L, 10D)).sortWith(_._2 > _._2)
output >>> Seq[(Long, Double)] = List((11,11.0), (2,10.0), (1,2.5), (2,0.0))
,如果我在排序列中添加一個元組與NaN
奇怪的事情發生
Seq[(Long, Double)]((1L, 2.5D), (2L, 0D), (3L, Double.NaN), (11L, 11D), (2L, 10D)).sortWith(_._2 > _._2)
output >>> Seq[(Long, Double)] = List((1,2.5), (2,0.0), (5,NaN), (11,11.0), (2,10.0))
所以它看起來像什麼都沒做
如果我交換前兩個元素
Seq[(Long, Double)]((2L, 0D), (1L, 2.5D), (5L, Double.NaN), (11L, 11D), (2L, 10D)).sortWith(_._2 > _._2)
output >>> Seq[(Long, Double)] = List((11,11.0), (2,10.0), (1,2.5), (2,0.0), (5,NaN))
排序工作再次??
同樣是只有Seq[Double]
Seq[Double](2.5, 0, Double.NaN, 11, 10).sortWith(_ > _)
output >>> Seq[Double] = List(2.5, 0.0, NaN, 11.0, 10.0)
Seq[Double](0, 2.5, Double.NaN, 11, 10).sortWith(_ > _)
output >>> Seq[Double] = List(11.0, 10.0, 2.5, 0.0, NaN)
.sortBy(_._2)
似乎在所有情況下工作的觀察。這是scala中的錯誤還是我的大腦?我在Ubuntu 16.04
和Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_91
上使用scala 2.11.8
和2.12.1
。
更新
事實證明,如果我反向排序然後稍微更可預見的事情發生
Seq[(Long, Double)]((1L, 2.5D), (2L, 0D), (3L, Double.NaN), (11L, 11D)).sortWith(_._2 < _._2)
output >>> Seq[(Long, Double)] = List((2,0.0), (1,2.5), (3,NaN), (11,11.0))
,但再次加在NaN
符之間的那種
Seq[(Long, Double)] = List((2,0.0), (3,NaN), (1,2.5), (11,11.0))
output >>> Seq[(Long, Double)] = List((1,2.5), (3,NaN), (2,0.0), (11,11.0))
因此Seq.sortWith
或.sortBy
只是決定放棄它時ees a NaN
?
在一個稍微不相關的說明,我碰到這個際,spark
被扔(下)一個錯誤,當我嘗試理清上述類型的元組序列。以上結果僅來自scala
REPL,但沒有涉及到火花。
java.lang.IllegalArgumentException:比較方法違反了它的一般合約!
也有一個與NaN
小號min/max of collections containing NaN (handling incomparability in ordering)
值得一提的是,下面的排序算法在'java.util.Arrays.sort'中。 –