始终使用拆分获取列表中的最后一项
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)
}
截至目前,我检索了我使用拆分生成的列表中的第一项,但我还想要单独函数中的最后一项。 问题是列表是从 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)
}