台灣最大程式設計社群網站
線上人數
808
 
會員總數:245973
討論主題:189551
歡迎您免費加入會員
討論區列表 >> Java >> 四個陣列找相同值 怎麼寫跑較快?
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
四個陣列找相同值 怎麼寫跑較快?
價值 : 50 QP  點閱數:1191 回應數:4
樓主

阿弦
門外漢
0 28
511 56
發送站內信

哈囉各位大大~
小弟不才,有個問題想問問各位高手
我目前有五個陣列名稱分別為UserIdArr、RestIdArr、MaleArr、MaleUserIdArr、MaleRestIdArr

UserIdArr 指的是使用者id的陣列
RestIdArr 指的是餐廳的id
MaleArr 指的是性別的編號 這邊預設都是0
這三個陣列是從文字檔取出的資料
每個user都會吃一到多個餐廳

所以UserIdArr跟RestIdArr 裡面的內容假設如下:

UserIdArr RestIdArr MaleArr
1 50 0
2 60 0
4 80 0
4 60 0
5 10 0
6 20 0
7 30 0

這裡指的是 陣列UserIdArr裡面有四筆資料1、2、4和4
RestIdArr陣列裡面也有四筆資料50、60、80、60
代表userId為1的使用者 吃過的餐廳編號是50
userId為2的使用者 吃過的餐廳編號是60
userId為3的使用者 吃過的餐廳編號是80
userId為4的使用者 吃過的餐廳編號是60
依此類推




再來是MaleUserIdArr和MaleRestIdArr
這兩個陣列的內容是從資料庫取出來的
MaleUserIdArr陣列裡面放的是男性user的資料編號
MaleRestIdArr陣列裡面放的是男性user吃過的餐廳編號
所以MaleUserIdArr跟MaleRestIdArr裡面的內容假設如下:

MaleUserIdArr MaleRestIdArr
1 50
4 80
4 60
5 10
7 30

所以userid=1、4、5、7是男性


現在我要找出 在UserIdArr和RestIdArr當中
男性的user他們的編號以及吃過的餐廳的編號
一旦找到符合的條件出現在UserIdArr 和RestIdArr當中,就將MaleArr裡面的值改成1
也就是說結果會是:
UserIdArr RestIdArr MaleArr
1 50 1
2 60 0
4 80 1
4 60 1
5 10 1
6 20 0
7 30 1

但我不知道程式該如何寫比較有效率,
因為我的資料有幾百萬筆,太龐大了如果一行一行去掃,真的會掃很久,
所以不知道該如何修改我的邏輯,
還請各位大大指點一翻...Orz

附上我的程式碼

搜尋相關Tags的文章: [ 陣列 ] , [ 邏輯 ] , [ 雙迴圈 ] , [ 保留重覆 ] ,
本篇文章發表於2014-03-25 17:17
1樓
作者回應

阿弦
檢舉此回應
嗚嗚 原本編排有排好的說
看不太懂還請各位大大盡量發問^^"
本篇文章回覆於2014-03-25 17:19
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

阿弦
檢舉此回應







目前那些陣列顯示方式排版是這樣
本篇文章回覆於2014-03-25 17:26
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
不錯的參考

Raymond
檢舉此回應
請問 MaleUserId 跟 MaleRestId 的資料是在同一個檔嗎? 或者說你在一樓的 3 個列表是代表 3 個檔的資料嗎?

以下是個人的想法. 這裡我把名字中的 'Arr' 去掉, 表示它是一筆資料, 而不是一個陣列的資料.

首先把 MaleUserId 跟 MaleRestId 的資料存放到一個 Map 裡, Key 用 MaleUserId, Value 用 Set 來存放 MaleRestId. 因為同一個人可以到多個餐廳用餐, 所以 RestId 要用 Collection 來存.
lang="javascript">
Map<Integer, Set<Integer>> maleUserRestMap = new HashMap<>();
</pre>

(RestId 也可以用 ArrayList 來存, 但 Set 的搜尋會比較快)

建立了 map 之後, 才去 scan UserId/RestId/Male 的資料檔. 最方便的方法是讀一行, 用 UserId 去上面的 Map 搜尋 (用 get() 成員), 如果 get() 傳回來的不是 null, 那再去 value 裡搜尋 RestId. 根據這最後搜尋的結果去決定 Male 的值; 最後把 UserId/RestId/Male 寫出到一個新的檔案裡.

這樣, MaleUserId/MaleRestId 資料檔跟 UserId/RestId/Male 資料檔只需各自讀一次.
本篇文章回覆於2014-03-25 23:55
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
最有價值解答

香帥
檢舉此回應
請在第5行與第6行之間加入

亦即找到之後,就跳離內迴圈,以節省時間
另外搜尋要快,建議用資料庫的索引
本篇文章回覆於2014-03-26 00:53
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.