4

我正在 Kotlin 中迈出第一步,并尝试编写一个简单的字符串拆分函数。我从这个开始:

fun splitCSV(s : String) : Array<String> {
    return s.split(",");
}

我想也可以这样写:

fun splitCSV(s : String) : Array<String> = s.split(",");

但是我收到类型错误,因为 s.split 返回 anArray<String?>?而不是Array<String>。我找不到一个简单的方法来进行转换,所以我编写了这个函数来进行转换:

fun forceNotNull<T>(a : Array<T?>?) : Array<T> {
    return Array<T>(a!!.size, { i -> a!![i]!! });
}

fun splitCSV(s : String) : Array<String> = forceNotNull(s.split(","));

但是,现在我遇到了运行时错误:

ClassCastException:[Ljava.lang.Object;不能转换为 [Ljava.lang.String

如果我将 T 更改forceNotNull为 String,那么它可以工作,所以我想我已经接近解决方案了。

这是正确的方法吗?如果是,我该如何解决forceNotNull在通用情况下的工作?

4

3 回答 3

1

不确定这是最好的方法,但这似乎有效:

fun splitCSV(s : String) : Array<String> {
  return ( s.split(",") as? Array<String>? ).sure() ;
}

尽管 IntelliJ 强调了as?这个演员永远不会成功” ......所以我最初的乐观情绪正在消退

奇怪的是,它似乎工作......

就像这样:

fun splitCSV(s : String) : Array<String> {
  return s.split(",").sure() as Array<String> ;
}

但是同样的警告......我很困惑,所以我现在就停下来:-/

编辑

当然,您可以使用它List<String>

import java.util.List

fun splitCSV(s : String) : List<String> {
  return s.split(",")!!.map<String?,String> { it!! }
}

但这不是问题;-)

于 2012-04-03T12:19:43.643 回答
1

自从发表这篇文章以来,kotlin 发生了很大变化,现在有很多更简单和更好的(应该避免显式转换)转换Array<T?>?为的方法Array<T>,一种方法是

val data: Array<String?>? = getData()
val notNullArray: Array<String> = data?.filterNotNull()?.toTypedArray() ?: arrayOf()

在这里,我们使用来filterNotNull获取 aList<String>然后将该列表转换Array<String>nullarrayOf()Array<T>

?:elvis运算符,如果它不为 null,则返回其左侧的表达式,否则返回右侧的表达式的值

于 2021-08-18T16:12:57.613 回答
0

以简单的方式,您可以通过以下方式将字符串转换为 kotlin 中的数组:-

fun splitCSV(s: String) = s.split(",").toTypedArray()

调用这个函数

val array: Array<String> = splitCSV("ABC,XYZ,test,rupesh")

在 kotlin CharSequence.split(regex) 返回 List 所以如果你想改变类型数组使用 .toTypedArray() 方法

于 2021-08-18T18:16:02.963 回答