使用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 

由于KKOTLIN之前是按照字典顺序KOTLIN ,所以你看到的结果总是有意义的。