首页 > 解决方案 > Kotlin:无法识别两个字符串相等

问题描述

可以这么说,我必须在教育目的中实现单位转换器。它转换长度、重量和温度单位。当用户进入1 kg to ounces程序返回 1.0 kilogram is 35.27399072294044 ounces等等。当输入/输出单位未知时,代码返回Conversion from ??? to ??? is impossible。例如,用户的输入 1 knn to feet和代码返回 Conversion from ??? to feet is impossible。问题始于温度单位。对于摄氏度,用户可以输入“摄氏度”、“摄氏度”、“摄氏度”、“dc”或“c”。华氏也是一样。当我使用“dc”或“c”或“celsius”时,一切正常,但当我使用“摄氏度”、“摄氏度”或“华氏度”作为输入/输出单位(5 degree celsius to k)时,我得到 Conversion from degrees Celsius to kelvins is impossible. 为什么会这样?为什么不'-block被认为是平等的,我该如何解决?

这是代码:

fun plural(unit: String): String {
    val plurals = listOf("grams", "kilograms", "milligrams", "pounds", "ounces", "meters", "kilometers", "centimeters",
        "millimeters", "miles", "yards", "feet", "inches", "degrees celsius", "degrees fahrenheit", "kelvins")

    if (unit in plurals) return unit

    when (unit) {
        "m", "meter" -> return "meters"
        "km", "kilometer" -> return "kilometers"
        "cm", "centimeter" -> return "centimeters"
        "mm", "millimeter" -> return "millimeters"
        "mi", "mile" -> return "miles"
        "yd", "yard" -> return "yards"
        "ft", "foot" -> return "feet"
        "in", "inch" -> return "inches"
        "g", "gram" -> return "grams"
        "kg", "kilogram" -> return "kilograms"
        "mg", "milligram" -> return "milligrams"
        "lb", "pound" -> return "pounds"
        "oz", "ounce" -> return "ounces"
        "degree celsius",  "celsius", "dc",  "c" -> return "degrees Celsius"
        "degree fahrenheit",  "fahrenheit", "df",  "f" -> return "degrees Fahrenheit"
        "kelvin",  "k" -> return "kelvins"
        else -> return "???"
    }
}

fun main() {
    print("Enter what you want to convert (or exit): ")
    var tag = false
    var inputVal: Double = 0.0
    var inputType: String
    var command = readLine().toString().lowercase()
    var inputUnitName = "???"
    var outputUnitName ="???"

    while (command != "exit") {
        val inputs = command.split(" ")
        //val inputVal = inputs[0].toDouble()
        //val inputVal: Double
           try { inputVal = inputs[0].toDouble()
            } catch (e: NumberFormatException) {
                //println("Parse error")
               tag = true
            }
        var inputUnits = inputs[1]
if (inputs[1].lowercase() == "degree" || inputs[1].lowercase() == "degrees" &&
    inputs[1].lowercase() == "celsius" || inputs[1].lowercase() == "Fahrenheit"){
    inputUnits = inputs[1] + " " + inputs[2]
    println(inputUnits)
}

        var outputUnits = inputs.last()
        if (inputs[inputs.size - 1] == "degree" || inputs[inputs.size - 1].lowercase() == "degrees" &&
            inputs.last().lowercase() == "celsius" || inputs.last().lowercase() == "Fahrenheit"){
            outputUnits = inputs[inputs.size - 1] + " " + inputs.last()
        }

        var intermediateVal: Double = 0.0
        val outputVal: Double

        when (inputUnits) {
            "m", "meter", "meters" -> {
                inputUnitName = (if (inputVal == 1.0) "meter" else "meters")
                inputType = "distance"
                intermediateVal = inputVal
            }
            "km", "kilometer", "kilometers" -> {
                inputUnitName = (if (inputVal == 1.0) "kilometer" else "kilometers")
                inputType = "distance"
                intermediateVal = inputVal * 1000
            }
            "cm", "centimeter", "centimeters" -> {
                inputUnitName = (if (inputVal == 1.0) "centimeter" else "centimeters")
                inputType = "distance"
                intermediateVal = inputVal * 0.01
            }
            "mm", "millimeter", "millimeters" -> {
                inputUnitName = (if (inputVal == 1.0) "millimeter" else "millimeters")
                inputType = "distance"
                intermediateVal = inputVal * 0.001
            }
            "mi", "mile", "miles" -> {
                inputUnitName = (if (inputVal == 1.0) "mile" else "miles")
                inputType = "distance"
                intermediateVal = inputVal * 1609.35
            }
            "yd", "yard", "yards" -> {
                inputUnitName = (if (inputVal == 1.0) "yard" else "yards")
                inputType = "distance"
                intermediateVal = inputVal * 0.9144
            }
            "ft", "foot", "feet" -> {
                inputUnitName = (if (inputVal == 1.0) "foot" else "feet")
                inputType = "distance"
                intermediateVal = inputVal * 0.3048
            }
            "in", "inch", "inches" -> {
                inputUnitName = (if (inputVal == 1.0) "inch" else "inches")
                inputType = "distance"
                intermediateVal = inputVal * 0.0254
            }
            "g", "gram", "grams" -> {
                inputUnitName = (if (inputVal == 1.0) "gram" else "grams")
                inputType = "weight"
                intermediateVal = inputVal
            }
            "kg", "kilogram", "kilograms" -> {
                inputUnitName = (if (inputVal == 1.0) "kilogram" else "kilograms")
                inputType = "weight"
                intermediateVal = inputVal * 1000
            }
            "mg", "milligram", "milligrams" -> {
                inputUnitName = (if (inputVal == 1.0) "milligram" else "milligrams")
                inputType = "weight"
                intermediateVal = inputVal * 0.001
            }
            "lb", "pound", "pounds" -> {
                inputUnitName = (if (inputVal == 1.0) "pound" else "pounds")
                inputType = "weight"
                intermediateVal = inputVal * 453.592
            }
            "oz", "ounce", "ounces" -> {
                inputUnitName = (if (inputVal == 1.0) "ounce" else "ounces")
                inputType = "weight"
                intermediateVal = inputVal * 28.3495
            }
            "celsius", "dc",  "c", "degree сelsius", "degrees сelsius" -> {
                inputUnitName = (if (inputVal == 1.0) "degree Celsius" else "degrees Celsius")
                inputType = "temper"
                //intermediateVal = inputVal * 28.3495
            }
            "degree Fahrenheit", "degrees Fahrenheit", "fahrenheit", "df",  "f" -> {
                inputUnitName = (if (inputVal == 1.0) "degree Fahrenheit" else "degrees Fahrenheit")
                inputType = "temper"
                //intermediateVal = inputVal * 28.3495
            }
            "kelvin", "kelvins", "k" -> {
                inputUnitName = (if (inputVal == 1.0) "kelvin" else "kelvins")
                inputType = "temper"
                //intermediateVal = inputVal * 28.3495
            }
            else -> {
                intermediateVal = inputVal
                inputType = ""
            }
        }

        when {
            inputType == "distance" && outputUnits in listOf("m", "meter", "meters") -> {
                outputVal = intermediateVal
                outputUnitName = (if (outputVal == 1.0) "meter" else "meters")
                println("$inputVal $inputUnitName is $outputVal $outputUnitName")
            }
            inputType == "distance" && outputUnits in listOf("km", "kilometer", "kilometers") -> {
                outputVal = intermediateVal / 1000
                outputUnitName = (if (outputVal == 1.0) "kilometer" else "kilometers")
                println("$inputVal $inputUnitName is $outputVal $outputUnitName")
            }
            inputType == "distance" && outputUnits in listOf("cm", "centimeter", "centimeters") -> {
                outputVal = intermediateVal / 0.01
                outputUnitName = (if (outputVal == 1.0) "centimeter" else "centimeters")
                println("$inputVal $inputUnitName is $outputVal $outputUnitName")
            }
            inputType == "distance" && outputUnits in listOf("mm", "millimeter", "millimeters") -> {
                outputVal = intermediateVal / 0.001
                outputUnitName = (if (outputVal == 1.0) "millimeter" else "millimeters")
                println("$inputVal $inputUnitName is $outputVal $outputUnitName")
            }
            inputType == "distance" && outputUnits in listOf("mi", "mile", "miles") -> {
                outputVal = intermediateVal / 1609.35
                outputUnitName = (if (outputVal == 1.0) "mile" else "miles")
                println("$inputVal $inputUnitName is $outputVal $outputUnitName")
            }
            inputType == "distance" && outputUnits in listOf("yd", "yard", "yards") -> {
                outputVal = intermediateVal / 0.9144
                outputUnitName = (if (outputVal == 1.0) "yard" else "yards")
                println("$inputVal $inputUnitName is $outputVal $outputUnitName")
            }
            inputType == "distance" && outputUnits in listOf("ft", "foot", "feet") -> {
                outputVal = intermediateVal / 0.3048
                outputUnitName = (if (outputVal == 1.0) "foot" else "feet")
                println("$inputVal $inputUnitName is $outputVal $outputUnitName")
            }
            inputType == "distance" && outputUnits in listOf("in", "inch", "inches") -> {
                outputVal = intermediateVal / 0.0254
                outputUnitName = (if (outputVal == 1.0) "inch" else "inches")
                println("$inputVal $inputUnitName is $outputVal $outputUnitName")
            }
            inputType == "weight" && outputUnits in listOf("g", "gram", "grams") -> {
                outputVal = intermediateVal
                outputUnitName = (if (outputVal == 1.0) "gram" else "grams")
                println("$inputVal $inputUnitName is $outputVal $outputUnitName")
            }
            inputType == "weight" && outputUnits in listOf("kg", "kilogram", "kilograms") -> {
                outputVal = intermediateVal / 1000
                outputUnitName = (if (outputVal == 1.0) "kilogram" else "kilograms")
                println("$inputVal $inputUnitName is $outputVal $outputUnitName")
            }
            inputType == "weight" && outputUnits in listOf("mg", "milligram", "milligrams") -> {
                outputVal = intermediateVal / 0.001
                outputUnitName = (if (outputVal == 1.0) "milligram" else "milligrams")
                println("$inputVal $inputUnitName is $outputVal $outputUnitName")
            }
            inputType == "weight" && outputUnits in listOf("lb", "pound", "pounds") -> {
                outputVal = intermediateVal / 453.592
                outputUnitName = (if (outputVal == 1.0) "pound" else "pounds")
                println("$inputVal $inputUnitName is $outputVal $outputUnitName")
            }
            inputType == "weight" && outputUnits in listOf("oz", "ounce", "ounces") -> {
                outputVal = intermediateVal / 28.3495
                outputUnitName = (if (outputVal == 1.0) "ounce" else "ounces")
                println("$inputVal $inputUnitName is $outputVal $outputUnitName")
            }
            inputType == "temper" && inputUnitName.lowercase() in listOf("degree celsius", "degrees celsius",
                "celsius", "dc",  "c") && outputUnits.lowercase() in listOf("degree Fahrenheit",
                "degrees Fahrenheit", "fahrenheit", "df", "f") -> {
                outputVal = inputVal * 9 / 5 + 32
                outputUnitName = (if (outputVal == 1.0) "degree Fahrenheit" else "degrees Fahrenheit")
                println("$inputVal $inputUnitName is $outputVal $outputUnitName")
            }
            inputType == "temper" && inputUnitName in listOf("degree Celsius", "degrees Celsius",
                "celsius", "dc",  "c") && outputUnits in listOf("degree Celsius", "degrees Celsius",
                "celsius", "dc",  "c") -> {
                outputVal = inputVal
                outputUnitName = (if (outputVal == 1.0) "degree Celsius" else "degrees Celsius")
                println("$inputVal $inputUnitName is $outputVal $outputUnitName")
            }
            inputType == "temper" && inputUnitName in listOf("degree Celsius", "degrees Celsius",
                "celsius", "dc",  "c") && outputUnits in listOf("kelvin", "kelvins", "k") -> {
                outputVal = inputVal + 273.15
                outputUnitName = (if (outputVal == 1.0) "kelvin" else "kelvins")
                println("$inputVal $inputUnitName is $outputVal $outputUnitName")
            }
            inputType == "temper" && inputUnitName in listOf("degree Fahrenheit",
                "degrees Fahrenheit", "fahrenheit", "df", "f") && outputUnits in listOf("degree Celsius", "degrees Celsius",
                "celsius", "dc",  "c") -> {
                outputVal = (inputVal - 32) * 5 / 9
                outputUnitName = (if (outputVal == 1.0) "degree Celsius" else "degrees Celsius")
                println("$inputVal $inputUnitName is $outputVal $outputUnitName")
            }
            inputType == "temper" && inputUnitName in listOf("degree Fahrenheit",
                "degrees Fahrenheit", "fahrenheit", "df", "f") && outputUnits in listOf("degree Fahrenheit",
                "degrees Fahrenheit", "fahrenheit", "df", "f") -> {
                outputVal = inputVal
                outputUnitName = (if (outputVal == 1.0) "degree Fahrenheit" else "degrees Fahrenheit")
                println("$inputVal $inputUnitName is $outputVal $outputUnitName")
            }

            inputType == "temper" && inputUnitName in listOf("degree Fahrenheit",
                "degrees Fahrenheit", "fahrenheit", "df", "f") && outputUnits in listOf("kelvin", "kelvins", "k") -> {
                outputVal = (inputVal + 459.67) * 5 / 9
                outputUnitName = (if (outputVal == 1.0) "kelvin" else "kelvins")
                println("$inputVal $inputUnitName is $outputVal $outputUnitName")
            }
            inputType == "temper" && inputUnitName in listOf("kelvin", "kelvins", "k") && outputUnits in
                    listOf("degree Fahrenheit", "degrees Fahrenheit", "fahrenheit", "df", "f") -> {
                outputVal = inputVal * 9 / 5 - 459.67
                outputUnitName = (if (outputVal == 1.0) "degree Fahrenheit" else "degrees Fahrenheit")
                println("$inputVal $inputUnitName is $outputVal $outputUnitName")
            }
            inputType == "temper" && inputUnitName in listOf("kelvin", "kelvins", "k") && outputUnits in
                    listOf( "degree Celsius", "degrees Celsius", "celsius", "dc", "c") -> {
                outputVal = inputVal - 273.15
                outputUnitName = (if (outputVal == 1.0) "degree Celsius" else "degrees Celsius")
                println("$inputVal $inputUnitName is $outputVal $outputUnitName")
            }
            inputType == "temper" && inputUnitName in listOf("kelvin", "kelvins", "k") && outputUnits in
                    listOf( "kelvin", "kelvins", "k") -> {
                outputVal = inputVal
                outputUnitName = (if (outputVal == 1.0) "kelvin" else "kelvins")
                println("$inputVal $inputUnitName is $outputVal $outputUnitName")
            }
            tag == true -> {println("Parse error")
            }
            else -> {
                println("Conversion from ${plural(inputUnits)} to ${plural(outputUnits)} is impossible")
            }
        }
        println()
        print("Enter what you want to convert (or exit): ")
        command = readLine().toString().lowercase()

    }

}

标签: kotlin

解决方案


问题 1: 您错误地链接了您的逻辑。

您基本上拥有的伪代码版本:

if (it=="degree" || it=="degrees" && it=="celsius" || it=="fahrenheit")

以及您需要做的:

if ((it=="degree" || it=="degrees") && (it=="celsius" || it=="fahrenheit"))

通过直接链接您的条件,您的逻辑基本上是:

if (it=="degree" || (it=="degrees" && it=="celsius") || it=="fahrenheit")

因为在算术运算中&&具有优先于||相同方式*的优先级。+

问题 2 您将文本的小写版本与大写的“Fahrenheit”进行比较,因此它永远不会是真的。你应该使用"fahrenheit".

问题 3 您正在使用inputs[1]所有四个条件,而我认为您的意思是inputs[2]用于后两个条件,因为您正在检查第三个单词是 Fahrenheit 还是 Celsuis。

问题 4 您的某些字符串中有一个不可见的 unicode U+1089 字符。由于它是缅甸语的稀有字符,IDE 和 StackOverflow 根本不会渲染它,但我可以通过打印 UTF 代码 ( println("degree сelsius".map { it.code })) 看到它。它看起来与度数符号°非常相似,所以我怀疑你是从某个地方复制粘贴的。要修复您的代码,请删除并重新键入所有涉及单词“degree”的字符串。

旁注:您的代码有大量重复。如果您为每种类型的 Unit 定义了一个类,列出了它可以使用的所有名称并将公式转换为某个基本单位,那么您的程序可能不太容易出错并且占用大约三分之一的行数。如果您发现自己复制粘贴了任何文字字符串,那么您的设计问题可能会导致错误。


推荐阅读