Kotlin 中 struct 的替换以及如何在运行时存储数据

我必须在 Kotlin 中存储和更新以下变量

string name;
Array of Class Objects(5)
Array of Int(5)
C++ format:
struct subject
{
  string name;
  Array of Class Objects(5)
  Array of Int(5)
};

vector<subject> sub;

在其他编程语言 C/C++ 中,例如,我们使用 struct 并将上面的所有内容放在里面。

问题:

  1. 如何在 Kotlin 中存储和更新混合不同类型(如数组、字符串等)的上述值?
  2. 数组不会一次性更新。例如:当有人使用名称调用AIDL接口时,我创建类的实例并将对象存储在类obj(0)的数组整数数组(0)中 也更新了一些价值。 当同一个 AIDL 接口再次以同名调用时,类的第二个实例将被创建并存储在类 obj(1)** 的 **array 和 integer array(1) 中并更新。由于名称相同,无需再次更新。 如何在运行时检查名称并更新其他数组?
  3. 另一个用例,我需要制作该结构的向量(根据 C++)。我如何在 Kotlin 中实现这一目标?
huihuiitsme 回答:Kotlin 中 struct 的替换以及如何在运行时存储数据

您可以在 Kotlin 中使用 struct 代替 classhttps://kotlinlang.org/docs/classes.html。两者之间存在一些相关差异:

  1. 声明和类成员以及实现在同一个地方完成。
  2. 构造函数声明内置于类声明中。
  3. Kotlin 倾向于不变性。虽然您可以更频繁地重新分配字段,但您会看到 val(如 const)和不可变集合。

话虽如此,你会做这样的事情来在 Kotlin 中实现你的结构。以下不是字面意义上的 1 对 1 翻译,而是如何使用惯用的 Kotlin 解决问题:

class Subject(val name: String) {
  val objects = mutableListOf<NameOfThatClass>()
  val numbers = mutableListOf<Int>()
}

该代码片段中发生的事情是我们声明了一个类 Subject。它有一个构造函数,它接受一个名为 name 的类型为 String 的参数。 val 关键字表示参数也将作为成员变量保留,并且该成员变量不能重新分配。接下来,在类体中,我们声明并分配另外两个成员变量。 objectsnumbers 也不会因为 val 关键字而被重新赋值,而是接收构造函数参数作为值而不是它们接收调用 mutableListOf() 的结果,它创建或多或少相当于 vector。我们也可以使用 arrayOfNulls(5)arrayOfInt(5),但除非您非常特别需要固定大小的数组,否则在 Kotlin 中使用列表会更容易也更常见。

然后你会像这样使用它:

val myName = "foo"
val myFirstObject = ...
val myFirstNumber = 1

val mySubject = Subject(myName)
mySubject.objects += myFirstObject
mySubject.numbers += myFirstNumber

你看到的 += 并不是真正的重新赋值,而是一个运算符重载,它相当于 Kotlin 的 std::vectorpush_back()https://kotlinlang.org/docs/collection-write.html#adding-elements

>

最后,如上所述,Kotlin 的列表是您通常用来代替 vector 的。但是,听起来您希望能够按名称查找特定条目,这对于地图 https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-map/ 来说更有效。你可以这样做:

val myMap = mutableMapOf<String,Subject>()
// add to the map like this
myMap[name] = Subject(name)
// get from the map like this (returns null if not in the map)
val mySubject = myMap[name]
// check if the subject is already in the map like this
myMap.containsKey(name)

然后,如果您需要像使用 Subject 一样遍历所有 vector,您可以使用 myMap.values 只获取 Subject

本文链接:https://www.f2er.com/548.html

大家都在问