Seq[(Long, Double)]
の場合、スカラー(2.11.8
および2.12.1
)で非常に奇妙なソート動作が発生しました。おそらく私は何か基本的なことを誤解しているでしょう。scala Seq sortWithまたはsortBy(NaNの場合)
私はソート列に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)]((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))
すべてが期待どおりに動作することでno Double.NaN
値でシーケンスを考えます何もしなかった
最初の2つの要素を交換する場合
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)
で観察されます。これはスカラー、または私の脳のバグですか?私はスカラー2.11.8
と2.12.1
をUbuntu 16.04
とJava HotSpot(TM) 64-Bit Server VM, Java 1.8.0_91
に使用しています。
更新
それは私がソート順序を逆ならば、少しより予測可能なものが
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
はちょうどea a NaN
?やや無関係なノートで
私は上記の種類のタプルの順序を並べ替えるしようとしていたときspark
(下)エラーを投げていたとして、私はこれに出くわしました。上記の結果は、scala
REPLからのものですが、スパークはありません。
java.lang.IllegalArgumentException:比較方法が一般契約に違反しています。
.max
と.min
に関連する質問がNaN
のmin/max of collections containing NaN (handling incomparability in ordering)
それは価値があるため、ソートアルゴリズムは 'java.util.Arrays.sort'の中にあります。 –