2012-04-20 114 views
1

我有什麼實現在Java中圖形的是2個表:從數據庫

Users (id, name, lastname) 
    Friends (id1, id2) 

鑑於這2桌,我需要能夠找到2個用戶之間的距離D(ID1,ID2)

我定義了一個User類,它保存了表中的每個用戶屬性。

我需要建立一個圖。我的數據結構圖是

 Map<User, Set<User>> 

將用戶映射到一組他的朋友。 我該如何構建圖表?我查詢了數據庫中所有用戶的ID的數據庫。我得到一個

int[] userids 

然後,對於每個該數組中INT:

(1)I建立一個用戶對象,在該用戶的分貝的屬性取

(2)I查詢在db朋友表以具有該用戶的朋友的id:

int [] friends 

(3)對每個在這個朋友陣列INT,我建立一個用戶對象在該用戶的分貝的屬性取並添加它到

Set<User> friends = new Set<User>(); 

問題1:任何想法如何做到這一點更好?考慮到我有500個用戶,並且在朋友表中有20000個條目,所以我們需要永遠的考慮......

這裏的一個大問題是當2個用戶在數據庫中是「相同的」時,他們被引用到不同的對象中我的圖!

這是搞亂了我的距離算法。我從一個用戶開始,得到他的朋友{f1,f2},並且當我想要使用graph.get(f1)和graph.get(f2)得到朋友的朋友時,我得到null(由於我的問題中陳述的原因,即1分貝用戶在許多不同的用戶對象)

我需要找到一種方法來建立我的圖,使1給定用戶說(1,約翰,Doe)在堆中的一個唯一的用戶對象引用。 ..

問題2:怎麼樣?

謝謝你這麼多

Help with Java Graph Implementation

+0

如何將所有用戶標識存儲在一個集合中?那會照顧重複 – 2012-04-20 16:19:43

回答

0

讀一次一個用戶將是緩慢的,這是很多往返到數據庫。如果Friends表中沒有索引,它會特別慢。

你最好從數據庫中獲取所有數據並自己構建Java圖形。

select UserId, ... from Users; 

,你現在所做的,構建爲每個用戶User。您需要創建一個Map,從userIdUser以供步驟2使用(因此您沒有爲同一個userId獲取多個User對象)。

select id1, id2 from Friends; 

然後查找兩個ID在以上Map,然後添加每一個User到另一User「出境邊集。

+0

好吧然後我的圖將變成Map <整數,設置>(朋友的ID和ID)和一個Map (ID到用戶對象)? – Myna 2012-04-21 18:16:00

+0

前者可能是'Map >'。作爲第三種選擇,我通常喜歡將用戶邊緣存儲在'用戶'本身,即'用戶'具有包含該用戶的朋友的實例變量'Set '。個人喜好,但是,你可以做到這一點。 – 2012-04-22 01:40:48

+0

我一直在努力,我有以下內容:地圖<整數,用戶>:查找表編號 地圖>,它將user_id映射到他的朋友的節點,以及一個是查找表。一世 – Myna 2012-04-28 03:22:40