我正在做一個專案,我正在從智能手表讀取加速度計傳感器資料。制作的應用程式有一個啟動和停止按鈕,分別啟動和停止傳感器讀數。
我想在用戶按下開始時開始記錄資料 - 我知道如何訪問傳感器資料,但我需要一種方法來存盤資料,直到按下停止按鈕。加速度計資料是 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,但是,不是用括號分隔每個向量(如上所示),它只是附加所有向量值到一個包含所有值的陣列(如標準陣列)。
希望我能得到一些幫助。提前致謝。
uj5u.com熱心網友回復:
資料類可能有意義:
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)
}
uj5u.com熱心網友回復:
如果您想使用 2D 結構執行此操作,您可以實體化一個 ArrayList 或 MutableList,然后您只需在每次有新資料時向其中添加串列。如果您專門使用 ArrayList,則可以指定初始大小。設定較大的初始大小有助于避免串列在添加資料時自行調整大小,如果串列變大,這可能是一項昂貴的操作。
val data = ArrayList<List<Float>>(10000)
//adding data:
data.add(listOf(xData, yData, zData))
但是,我可能會使用 1D 集合,因為所有資料點都是浮點數(或雙精度數?),并且一次讀取 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
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/443741.html
標籤:安卓工作室 科特林 kotlin-android-扩展
上一篇:如何在kotlin中獲得許可結果
