1

私はこの方法を持っています:

def isSorted[A](as: Array[A], ordered: (A, A) => Boolean): Boolean = {
    val sorted = for (it <- as.sliding(2))
      yield {
        if (it.length == 2) ordered.apply(it(0), it(1))
        else true
      }

    sorted.find(!_).isEmpty
}

私がやりたいのはfoldLeft、二項演算子を使用して適用することです。ただし、foldLeft初期値が必要であり、の実際の型を知らずに提供できる初期値がわかりませんA

4

3 に答える 3

2

あなたがしていることは単純化できると思います。

def isSorted[A](as: Array[A], ordered: (A, A) => Boolean): Boolean = {
  if (as.size < 2)
    true
  else
    as.sliding(2).find(x => !ordered(x(0),x(1))).isEmpty
}

isSorted: [A](as: Array[A], ordered: (A, A) => Boolean)Boolean

scala> isSorted( Array(2), {(a:Int,b:Int) => a < b} )
res42: Boolean = true

scala> isSorted( Array(2,4), {(a:Int,b:Int) => a < b} )
res43: Boolean = true

scala> isSorted( Array(2,4,5), {(a:Int,b:Int) => a < b} )
res44: Boolean = true

scala> isSorted( Array(2,14,5), {(a:Int,b:Int) => a < b} )
res45: Boolean = false

または、おそらくもう少し簡潔に (ただし、必ずしも理解しやすいとは限りません):

def isSorted[A](as: Array[A], ordered: (A, A) => Boolean): Boolean = {
  if (as.size < 2)
    true
  else
    !as.sliding(2).exists(x => ordered(x(1),x(0)))
}

アップデート

OK、私は簡潔な賞を釘付けにしたと思います.

def isSorted[A](as: Array[A], ordered: (A, A) => Boolean): Boolean =
  as.isEmpty || as.init.corresponds(as.tail)(ordered)
于 2016-01-23T08:35:46.397 に答える
1

foldLeft の初期値には、入力配列の head を使用できます。ただし、並べ替えられていない要素が最初に見つかったときにメソッドを終了する必要がありますが、foldLeft は配列全体をトラバースするため、foldLeft は配列が並べ替えられているかどうかを確認するのに適した選択ではありません。

編集:

zip と tail および exists の組み合わせを使用します。

isSorted(...) = 
   if (as.isEmpty) true
   else !as.zip(as.tail).exists { case (a,b) => !ordered(a,b)}
于 2016-01-23T06:50:32.913 に答える
1

他の回答に加えて、配列全体を反復処理するのではなく、順序付けられていないペアを見つけた時点で終了することをお勧めします。では、これはどうですか?

def isSorted[A](as: Array[A], ordered: (A, A) => Boolean): Boolean = {
  var sorted = true
  val ita = as.sliding(2)
  while (sorted && ita.hasNext) {
    val it = ita.next
    sorted = if (it.size > 1) ordered(it(0), it(1)) else true
  }
  sorted
}

val a = Array(1, 3, 2, 4, 5)
val b = Array(1, 2, 3, 4, 5)

isSorted[Int](a, _ < _) // returns false
isSorted[Int](b, _ < _) // returns true
于 2016-01-23T10:49:58.810 に答える