数组数组/对象数组/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吗?或者,对于最好的数据结构解决方案是什么,你有其他建议吗?截至目前,数据只需要在应用程序运行期间存储即可。

我不知道为什么我不能在Kotlin中弄清楚如何做到这一点,我只能制作一个ArrayList的ArrayList,然而,它不是用括号分隔每个向量(如上所示(,而是将所有向量值附加到一个包含所有值的数组中(就像标准数组一样(。

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

数据类可能有意义:

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)
}

如果你想用2D结构来实现这一点,你可以实例化一个ArrayList或MutableList,然后你只需要在每次有新数据时向它添加列表。如果您专门使用ArrayList,则可以指定初始大小。设置较大的初始大小有助于避免在添加数据时必须调整列表大小,如果列表变大,这可能是一项昂贵的操作。

val data = ArrayList<List<Float>>(10000)
//adding data:
data.add(listOf(xData, yData, zData))

然而,我可能会使用1D集合,因为所有的数据点都是Floats(或Doubles?(,而且一次读取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

最新更新