2012-04-20 115 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