You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin快速排序单元测试结果非确定性问题求助

整数数组快速排序的非确定性测试问题

我正在通过实现整数数组快速排序学习Kotlin,目前的代码实现如下:

Program类实现

enum class SortingCriterion {
    DESCENDING, ASCENDING
}

class Program(
    private val data: Array<Int>,
    private val sortingCriterion: SortingCriterion = SortingCriterion.ASCENDING
) {

    fun run() = sort(data.copyOf())

    private fun sort(data: Array<Int>): Result {

        if (data.size < 2) {
            return Result(data)
        }

        val pivot = chooseRandomPivot()
        val less = data.asSequence().filter { e -> e < pivot }.toList().toIntArray().toTypedArray()
        val greater = data.asSequence().filter { e -> e > pivot }.toList().toIntArray().toTypedArray()

        return if (sortingCriterion == SortingCriterion.ASCENDING)
            Result(sort(less).data + pivot + sort(greater).data)
        else Result(sort(greater).data + pivot + sort(less).data)
    }

    private fun chooseRandomPivot() = data[data.indices.random()]
}

Result类实现

为了方便断言预期结果和实际结果的相等性,我用Result类包装排序结果:

class Result(val data: Array<Int>) {
    override fun equals(other: Any?): Boolean {
        if (this === other) return true
        if (javaClass != other?.javaClass) return false

        other as Result

        return data.contentEquals(other.data)
    }

    override fun hashCode(): Int {
        return data.contentHashCode()
    }
}

测试代码

import org.junit.jupiter.api.Assertions.*
import kotlin.test.Test

class ProgramTest {

    @Test
    fun sort_data_in_default_order() {
        val actualResult = Program(arrayOf(1, 5, 4)).run()
        assertEquals(Result(arrayOf(1, 4, 5)), actualResult)
    }

    @Test
    fun sort_data_in_ascending_order() {
        val actualResult = Program(arrayOf(1, 5, 4), SortingCriterion.ASCENDING).run()
        assertEquals(Result(arrayOf(1, 4, 5)), actualResult)
    }

    @Test
    fun sort_data_in_descending_order() {
        val actualResult = Program(arrayOf(1, 5, 4), SortingCriterion.DESCENDING).run()
        assertEquals(Result(arrayOf(5, 4, 1)), actualResult)
    }
}

问题现象

测试结果具有非确定性:有时所有测试都通过,但偶尔会有测试失败。某次失败的错误信息如下:

expected: <Result@87a1> but was: <Result@10709e>
Expected :Result@87a1
Actual   :Result@10709e
<Click to see difference>

org.opentest4j.AssertionFailedError: expected: <Result@87a1> but was: <Result@10709e>
    at app//org.junit.jupiter.api.AssertionUtils.fail(AssertionUtils.java:55)
    at app//org.junit.jupiter.api.AssertionUtils.failNotEqual(AssertionUtils.java:62)

请问我的实现是否存在错误?


内容的提问来源于stack exchange,提问作者Uvuvwevwevwevwe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 03:37:55