arrayList 的 objects/arrayList 的 arrays/array 数组

Array of arrays/array of objects/arrayList of arrayList

我正在做一个项目,我正在从智能手表读取加速度计传感器数据。制作的应用程序有一个启动和停止按钮,分别启动和停止传感器读数。

我想在用户按下开始时开始记录数据 - 我知道如何访问传感器数据,但我需要一种方法来存储数据直到按下停止按钮。加速度计数据是 X、Y 和 Z 轴数据,看起来像这样:

[2.034343, 8.342423, 0.012313]

所以我需要一种方法将这种类型的向量存储在一个额外的数组中,以便将记录的每个向量分开。因此,当记录了三个数据向量时,我正在寻找的数据结构应该看起来像这样:

[[2.034343, 8.342423, 0.012313], [6.031843, 2.349153, 0.012313], [1.734843, 5.342423, 1.012393]]

数据结构将在用户按下开始到按下停止之间的时间内用这些向量填充。

我需要一个 ArrayList 的 ArrayList 吗?或者对于最佳数据结构解决方案是什么,您有任何其他建议吗?截至目前,只要应用程序 运行.

就需要存储数据

我不知道为什么我不知道如何在 Kotlin 中执行此操作,我只能制作 ArrayList 的 ArrayList,但是,不是用方括号分隔每个向量(如上所示)它只是将所有向量值附加到包含所有值的数组(如标准数组)。

希望能得到一些帮助。提前致谢。

如果要使用二维结构执行此操作,可以实例化 ArrayList 或 MutableList,然后在每次有新数据时向其添加列表。如果你专门使用 ArrayList,你可以指定初始大小。设置较大的初始大小有助于避免列表在您添加数据时必须自行调整大小,如果列表变大,这可能是一项昂贵的操作。

val data = ArrayList<List<Float>>(10000)

//adding data:
data.add(listOf(xData, yData, zData))

但是,我可能会使用一维集合,因为所有数据点都是浮点数(或双精度数?)并且一次读取 3 个数据点很容易。然后你就不必创建一个新的集合对象来包装每个数据点,这需要更多的内存分配。

通常情况下,我不会做这样的事情,这会牺牲代码的清晰度和简洁性,但由于您正在记录可能非常大的数据流,因此预先对其进行一些优化是有意义的。

val data = ArrayList<Float>(30000)

//adding data:
data.add(xData)
data.add(yData)
data.add(zData)

//iterating the data later:
for (i in 0 until data.size step 3) {
    val x = data[i]
    val y = data[i + 1]
    val z = data[i + 2]
    //...
}

// Or if you have a Point class, you could create a wrapper class
// for getting the points lazily:
class PointAccessor(val source: List<Float>) {
    operator fun get(index: Int): Point {
        val i = index * 3
        return Point(source[i], source[i + 1], source[i + 2])
    }
}

val pointData = PointAccessor(data)

val someX = pointData[4].x

一个data class可能是有道理的:

data class Point(val x: Double, val y: Double, val z: Double)

val list = mutableListOf<Point>()

list.add(Point(2.034343, 8.342423, 0.012313))
list.add(Point(6.031843, 2.349153, 0.012313))
list.add(Point(1.734843, 5.342423, 1.012393))

for (point in list) {
  println("Point: " + point.x + " | " + point.y + " | " + point.z)
}