Это самая странная вещь, которую я видел с моим IntelliJ при работе над проектом sbt - я могу поделиться более подробной информацией о сценарии использования, если это необходимо.
У меня есть оператор if, и в отладке я наблюдаю, что блок, следующий за ним, вводится, когда этот оператор оценивается как ложный.
Я пытался запустить sbt compile
, sbt reload
. Я также сделал недействительными кэши и перезапустил IntelliJ.
Это код:
class MedianOf3Partitioning[T: ClassTag : Ordering] extends QuickSort[T] with MedianOfPartitioning[T] {
protected val MEDIAN_OF = 3
override protected def sort(a: Array[T], lo: Int, hi: Int): Array[T] = {
if (hi > lo || (hi - lo) > MEDIAN_OF) {
val sampleArray = getSample(a.slice(lo, hi), MEDIAN_OF)
patchArray(a, lo, hi, sampleArray)
val j = partition(a, lo, hi)
sort(a, lo, j - 1)
sort(a, j + 1, hi)
} else return super.sort(a, lo, hi)
}
}
А вот скриншот из сеанса отладки, который демонстрирует, что происходит:
Итак, оба условия ложны, но введен код в фигурных скобках после оператора.
Моя версия IntelliJ - 2018,3
Update
Я выполняю код, запустив этот тестовый класс:
class MedianOf3PartitioningSpec extends BaseSpec {
private val testCase: Array[Char] = "EASYQUICKSORTQUESTION" toCharArray
behavior of "MedianOf3PartitioningSpec"
it should "sort" in {
val medianOf3Partitioning = new MedianOf3Partitioning[Char]
val maybeSortedArray = medianOf3Partitioning sort(testCase)
maybeSortedArray shouldBe sorted
}
}
Я запускал его с помощью IntelliJ (как обычно). Я просто попробовал простую командную строку testOnly *MedianOf3PartitioningSpec
, но по той же причине она не работает
Если я разрешу запускать код (игнорируя это странное наблюдение, о котором я рассказывал выше), то проверка завершится неудачно с этим:
[info] - should sort *** FAILED ***
[info] java.lang.IllegalArgumentException: bound must be positive
[info] at java.util.Random.nextInt(Random.java:388)
[info] at scala.util.Random.nextInt(Random.scala:66)
[info] at ca.vgorcinschi.algorithms2_3.MedianOfPartitioning.getSample(MedianOfPartitioning.scala:14)
[info] at ca.vgorcinschi.algorithms2_3.MedianOfPartitioning.getSample$(MedianOfPartitioning.scala:13)
[info] at ca.vgorcinschi.algorithms2_3.MedianOf3Partitioning.getSample(MedianOf3Partitioning.scala:16)
[info] at ca.vgorcinschi.algorithms2_3.MedianOf3Partitioning.sort(MedianOf3Partitioning.scala:22)
[info] at ca.vgorcinschi.algorithms2_3.MedianOf3Partitioning.sort(MedianOf3Partitioning.scala:25)
[info] at ca.vgorcinschi.algorithms2_3.MedianOf3Partitioning.sort(MedianOf3Partitioning.scala:26)
[info] at ca.vgorcinschi.algorithms2_3.QuickSort.sort(QuickSort.scala:13)
[info] at ca.vgorcinschi.algorithms2_3.MedianOf3PartitioningSpec.$anonfun$new$1(MedianOf3PartitioningSpec.scala:13)
... где getSample
делает это:
trait MedianOfPartitioning [T] {
this: BaseSort[T] =>
protected val MEDIAN_OF: Int
protected def getSample(a: Array[T], medianOf: Int): Array[T] = {
val sampleArrayOffset = Random.nextInt(a.length - medianOf)
a.slice(sampleArrayOffset, sampleArrayOffset + medianOf)
}
/**
* Mutate the main array to have at its head the smallest value from sample
* array and at its last index the biggest value from sample array
* @param a - target array
* @param sampleArray - size should be equal to {@link MEDIAN_OF}
*/
def patchArray(a: Array[T], lo: Int, hi: Int, sampleArray: Array[T]): Unit = {
val (minVal, maxVal) = ((sampleArray.head, sampleArray.head) /: sampleArray) { case ((tempMin, tempMax), current) =>
(min(tempMin, current), max(tempMax, current))
}
exch(a, a.indexOf(minVal), lo)
exch(a, a.indexOf(maxVal), hi)
}
}
Но если в случае правильной оценки выписки getSample
не следует вводить в первую очередь (это и есть намерение). Возможно, в комнате есть слон, которого я не вижу, но я был бы признателен, если бы кто-то мог указать мне на это: -)