題目:
有一含 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() 內加上時間當做亂數種子, 增強其隨機性 ... ... }
沒有留言:
張貼留言