使用in运算符来比较字符串与字符串的范围
我正在使用运算符来检查值是否在范围内。 但我无法准确理解如何与字符串范围进行比较。 下面是我尝试过的几个参数和输出:
println("KOTLIN" in "J".."K") false println("KOTLIN" in "Java".."Scala") true println("KOTLIN" in "Java".."Bhuv") false
in
编译成以下函数(在kotlin.ranges.Range.kt
定义):
public operator fun contains(value: T): Boolean = value >= start && value <= endInclusive
所以"KOTLIN" in "J".."K"
导致:
("J".."K").contains("KOTLIN")
这种情况下的比较依赖于正常的String
比较,因为> =和<=被编译为compareTo
变体。 实现如下所示:
public int compareTo(String anotherString) { int len1 = value.length; int len2 = anotherString.value.length; int lim = Math.min(len1, len2); char v1[] = value; char v2[] = anotherString.value; int k = 0; while (k < lim) { char c1 = v1[k]; char c2 = v2[k]; if (c1 != c2) { return c1 - c2; } k++; } return len1 - len2; }
因此, "KOTLIN" in "Java".."Scala"
等于以下内容:
"KOTLIN".compareTo("Java") >=0 && "KOTLIN".compareTo("Scala") <= 0
根据你的问题,我想你对这个结果感到困惑:
println("KOTLIN" in "J".."K")
是false
基本上,如果你要使用Java的字符串比较实现来排序,你会看到:
Bhuv J Java K KOTLIN KZ
由于K
在KOTLIN
之前是按照字典顺序KOTLIN
,所以你看到的结果总是有意义的。