5.24.2015

Scala: SeqLike#sortBy Never Compares in a Single Element Collection

Scala: sortBy は要素が一個だけの場合に比較を行わない

 

シーケンスの sortBy メソッドを利用し、要素を変換したあとにソートしたい。
変換処理で例外が発生する可能性がある場合の挙動。

シーケンスの要素が 1個だけの場合、コンペア自体が行われないため、期待した例外が送出されなかった。

scala> Seq.empty[String].sortBy(_.toInt)
res0: Seq[String] = List()

scala> Seq("a").sortBy(_.toInt)
res1: Seq[String] = List(a)

scala> Seq("a", "b").sortBy(_.toInt)
java.lang.NumberFormatException: For input string: "b"
  at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
  at java.lang.Integer.parseInt(Integer.java:492)
  at java.lang.Integer.parseInt(Integer.java:527)
  at scala.collection.immutable.StringLike$class.toInt(StringLike.scala:247)
  at scala.collection.immutable.StringOps.toInt(StringOps.scala:30)
  at $anonfun$1.apply(:8)
  at $anonfun$1.apply(:8)
  at scala.math.Ordering$$anon$5.compare(Ordering.scala:122)
  at java.util.TimSort.countRunAndMakeAscending(TimSort.java:324)
  at java.util.TimSort.sort(TimSort.java:189)
  at java.util.TimSort.sort(TimSort.java:173)
  at java.util.Arrays.sort(Arrays.java:659)
  at scala.collection.SeqLike$class.sorted(SeqLike.scala:618)
  at scala.collection.AbstractSeq.sorted(Seq.scala:41)
  at scala.collection.SeqLike$class.sortBy(SeqLike.scala:597)
  at scala.collection.AbstractSeq.sortBy(Seq.scala:41)
  ... 33 elided

0 件のコメント:

コメントを投稿