始终使用拆分获取列表中的最后一项

Always getting the last item in a list using split

截至目前,我检索了我使用拆分生成的列表中的第一项,但我还想要单独函数中的最后一项。 问题是列表是从 ocr 生成的,并且长度或大小永远不会相同。

kotlin 中有没有办法始终获取最后一项?

这是获取第一个的代码:

fun String.firstLine(): String {
if (this.isEmpty()) return ""
return this.split("\n").get(0)
}

你可以这样做:

fun String.firstAndLast() = split("\n").let { it.first() to it.last() }

fun main() {
    val s = "first line\nsecond line\nlast line"
    val (first, last) = s.firstAndLast()
    println(first)
    println(last)
}

输出为:

first line
last line

fun会拆分,然后使用结果列表,只获取第一个和最后一个元素,返回一个Pair<String, String>,可以用val (first, last)轻松解构,然后可以使用这些值分开。


编辑:对于倒数第二个,我认为列表可能不是一个好主意。我个人会选择某种对象,或者使用 Triple。

Class方式:

class NoNameIdeas(
    val first: String = "",
    val penultimate: String = "",
    val last: String = ""
) {
    companion object {
        fun fromString(string: String): NoNameIdeas {
            val l = string.split("\n")
            val first = l.first()

            return when (l.size) {
                1 -> NoNameIdeas(first = first)
                2 -> NoNameIdeas(first = first, penultimate = "what should this be?", last = l.last())
                else -> NoNameIdeas(first = first, penultimate = l[l.lastIndex - 1], last = l.last())
            }
        }
    }
}

fun main() {
    val string = "first line\nsecond line\nsecond last\nlast line"
    val result = NoNameIdeas.fromString(string)

    println(result.first)
    println(result.penultimate)
    println(result.last)
}

如您所料,我不知道如何命名这个对象。另一个问题是,如果我们总共只有2 lines,我们应该如何处理倒数第二个?可以和第一个一样,也可以为空,也可以和最后一个一样。那是你的决定,它也可能永远不会发生,只有你知道你有什么数据。

不使用 class 但使用三元组的另一种方法:

三重方式:

fun main() {
    val string = "first line\nsecond line\nsecond last\nlast line"
    val result = string.firstPenultimateAndLast()

    println(result.first)
    println(result.second)
    println(result.third)
}


fun String.firstPenultimateAndLast(): Triple<String, String, String> {
    val l = split("\n")
    val first = l.first()
    var penultimate = "" //same as the class, what happens when we only have 2 lines?
    var last = l.first() //if we only have 1, then I guess that the first is the last as well, will get a new value otherwise

    when (l.size) {
        2 -> last = l.last()
        else -> {
            penultimate = l[lastIndex - 1]
            last = l.last()
        }
    }

    return Triple(first, penultimate, last)
}