【问题标题】:Replacement for struct in Kotlin and how to store the data in the run timeKotlin 中 struct 的替换以及如何在运行时存储数据
【发布时间】:2021-08-01 20:55:48
【问题描述】:

我必须在 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++ for ex 中,我们使用 struct 并将上面的所有内容放在其中。

问题:

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

【问题讨论】:

  • 我无法理解您的问题,能否请您提供更多详细信息?
  • 感谢您的回复。我再次更新查询。

标签: kotlin data-class


【解决方案1】:

您可以在 Kotlin 中使用 class 代替 structhttps://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>()
}

在代码 sn-p 中发生的事情是我们正在声明一个类 Subject。它有一个构造函数,它接受一个名为nameString 类型的参数。 val 关键字意味着该参数也将作为成员变量保留,并且该成员变量不能重新分配。接下来,在类主体中,我们声明并分配另外两个成员变量。由于val 关键字,objectsnumbers 也将不可重新分配,但它们不会接收构造函数参数作为值,而是接收调用mutableListOf() 的结果,这或多或少相当于@ 987654337@。我们也可以使用 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)

然后,如果您需要像使用 vector 一样遍历所有 Subjects,则可以使用 myMap.values 来仅获取 Subjects。

【讨论】:

  • 嗨,蒂姆,非常感谢。我们不能在 Kotlin 中使用数据类而不是普通类吗?
猜你喜欢
  • 2019-08-13
  • 1970-01-01
  • 1970-01-01
  • 2011-06-29
  • 2016-08-20
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多