kotlin - 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()
}
}
解决方案
问题 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 定义了一个类,列出了它可以使用的所有名称并将公式转换为某个基本单位,那么您的程序可能不太容易出错并且占用大约三分之一的行数。如果您发现自己复制粘贴了任何文字字符串,那么您的设计问题可能会导致错误。
推荐阅读
- python - 在 Kivy 中独立移动多个小部件
- python - 为什么 BuiltinImporter.create_module 只恢复部分内置模块?
- java - Android 从 SD 卡读取文件的权限问题
- arrays - foreach powershell 中的字符串操作
- python - Django Rest Framework ManyToMany 字段排序
- authentication - Yandex OAuth GitLab 用户身份验证
- bash - 条件保存在 bash 的变量中
- javascript - 触发 oninput 事件后重新加载 javascript 文件
- r - 如何用点改变ggplot2箱线图颜色
- python - 使用 Python 查询不同服务器上的 100 多个 SQL 数据库