如何使用Kotlin检查字符串数组是否按字母顺序排序?

时间:2017-11-14 22:35:39

标签: arrays string kotlin

我获得了一个字符串列表,我需要查看它们是否按字母顺序排列。

我知道我需要使用for循环并检查每个字符串的第一个字符,但我不知道如何从那里进步。

for (item in array)
     println(item[0])

例如["adam", "ben", "chloe"]应该返回true

同样["ben", "adam", "chloe"]应该返回false

7 个答案:

答案 0 :(得分:5)

这是一个班轮:

val a = listOf("a", "b", "c")
a.zip(a.drop(1)).all { (a, b) -> a <= b }
// true

说明:

a.zip(a.drop(1))返回邻居元素对。如果在每一对中第一个元素小于或等于下一个元素,则数组是有序的。

如果要提高性能,可以先将数组换成延迟序列。在这种情况下,不会复制数组:

a.asSequence().let { it.zip(it.drop(1)).all { (a, b) -> a < b }  }

整个事情是O(N)(单通道数组),这是此任务的最佳选择。

答案 1 :(得分:2)

you can use a simple one-liner:

array.zipWithNext { s1, s2 -> s1 <= s2 }.all { it }

答案 2 :(得分:1)

我确信你可以完全使用for循环完成你想要的任务。

然而,在Kotlin中,我个人认为使用until做这样的事情更为惯用:

fun isAlphabetical(stringsArray: Array<String>): Boolean {
    if (stringsArray.size < 2) return true
    return (1 until stringsArray.size).none { stringsArray[it] <= stringsArray[it - 1] }
}

fun main(args: Array<String>) {
    val testCases = arrayOf(arrayOf("adam", "ben", "chloe"), arrayOf("ben", "adam", "chloe"))

    for(testCase : Array<String> in testCases){
        println("The strings are: ${testCase.joinToString()}")
        if (isAlphabetical(testCase)) {
            println("Strings are in alphabetical order.\n")
        } else {
            println("Strings are not in alphabetical order.\n")        
        }
    }    
}

<强>输出:

The strings are: adam, ben, chloe
Strings are in alphabetical order.

The strings are: ben, adam, chloe
Strings are not in alphabetical order.

基本上,如果数组的长度超过<=,则只将数组的每个元素与前一个元素(使用1)进行比较。

答案 3 :(得分:1)

一种非常简单易行的方法是将原始列表与已排序的列表进行排序和比较(两个列表在相同的顺序中具有完全相同的元素时相同)。由于您提到您正在处理数组,因此首先需要将其转换为列表。此解决方案在性能方面不是最佳解决方案(它是O(n log n)并将数组转换为列表两次),但它非常易读:

val test = array.asList() == array.asList().sorted()

您的问题的完整代码可能是:

println(if (array.asList() == array.asList().sorted()) "Strings are in alphabetical order." else "Strings are not in alphabetical order.")

答案 4 :(得分:1)

另一种解决方案:

val list = listOf("a", "b", "c")
list.windowed(2).none { (a, b) -> a > b }
// true

答案 5 :(得分:0)

又一个解决方案:)

data class Result(val isInOrder: Boolean, val lastString: String) {
    val toString = when {
        isInOrder -> "Strings are in alphabetical order."
        else -> "Strings are not in alphabetical order."
    }
}

fun Array<String>.isInAlphabeticalOrder() =
    this.fold(Result(true, ""), { acc, word -> Result(acc.isInOrder && acc.lastString < word, word) })

fun main(args: Array<String>) {
    val test1 = arrayOf("adam", "ben", "chloe")
    val test2 = arrayOf("ben", "adam", "chloe")
    println(test1.isInAlphabeticalOrder().toString)
    println(test2.isInAlphabeticalOrder().toString)
}

答案 6 :(得分:0)

如果您想比较任意Comparable列表:

fun <T : Comparable<T>> isCollectionSortedAsc(list: Collection<T>): Boolean {
  return list.zipWithNext { a, b -> a.compareTo(b) == -1 }.all { it }
}

基于上面接受的答案:https://stackoverflow.com/a/47296632/4919972