題目:
有一含 1000 筆記錄的資料表 table1,要從中取出任意 100 筆
在詢問 Google 的 Gemini、OpenAI 的 ChatGPT、Perplexity 的 Perplexity、微軟的 Copilot 後,多認識了一些類別及技巧,故做此筆記。
做法一:
val mScope = CoroutineScope(Job() + Dispatchers.IO)
mScope.launch {
val mDbHelper = SQLite(baseContext)
var db = mDbHelper.readableDatabase
// 查詢本機資料庫有幾筆記錄
var sSql = "SELECT * FROM table1 "
val rs = db.rawQuery(sSql, null)
val mRecnt = rs.count // 本機資料庫記錄筆數
var mSentence = 100 // 迴圈數, 要取出 100 筆記錄
val mList = mutableListOf<Int>()
var xx = 1
// 這種做法, 有可能亂數取得的 mPos 已存在 mList 中
while(xx<=mSentence) {
val mPos = (0 until mRecnt).random() // 每筆記錄在 table1 的位置
if(mPos !in mList) {
mList.add(mPos)
xx++
}
}
mList.sorted() // 將 mList 內的元素由小到大排序
// 如此, 在實際自 table1 取出記錄就會是自資料表首一路向資料表尾依序取出記錄
...
...
}
做法二:
val mScope = CoroutineScope(Job() + Dispatchers.IO)
mScope.launch {
...
...
val mRaw = mutableSetOf<Int>() // mutableSet 的特性是存入時就會檢查每個元素的值都是唯一
val mRandom = Random(System.currentTimeMillis())
while(mRaw.size<mSentence) {
mRaw.add(mRandom.nextInt(mRecnt))
}
// 但 mutableSet 不具排序功能,
// 故將它轉型態成 list 並排序後存入 mList
val mList = mRaw.toList().sorted()
...
...
}
做法三:
val mScope = CoroutineScope(Job() + Dispatchers.IO)
mScope.launch {
...
...
// 這個做法最快, 一行指令搞定
// 以 shuffled() 洗牌後, 再以 take() 取前面幾個元素, 再將元素排序
// (0 until mRecnt) 是 IntRange
val mList = (0 until mRecnt).shuffled().take(mSentence).sorted()
// val mList = (0 until mRecnt).shuffled(Random(System.currentTimeMillis())).take(mSentence).sorted() // 可以在 shuffled() 內加上時間當做亂數種子, 增強其隨機性
...
...
}
沒有留言:
張貼留言