我有一个电影数据库(postgreSQL)。其中一个表包含演员和电影标题。我必须在java中解决的分配如下:两个演员(A和B)在同一部电影中连接在一起。还有两个演员,A和B,当有第三个演员C,他们在不同的电影中播放他们(A和B不在一起玩!)等时也连接起来......等等...我希望你得到想法:)现在我必须找到两个演员之间的最短连接(=路径)。
现在实现:从DB(预准备语句)中获取数据并将名称(作为字符串)保存在链表中是有效的。除了像A - >之类的演员之间的简单联系。 B(=同时在同一部电影中播放)。我试图包含更复杂的连接(如A - > B - > C)。
我将actor名称存储在HashMap中,如下所示:
Map<String, List<String>> actorHashMap = new HashMap<String, List<String>>();
因此,当我加载第一个演员(Johnny Depp)时,我将他的名字作为键,并且其他演员在键中引用的列表中与他一起玩。检查,是否有其他演员与他一起玩很容易:
List<String> connectedActors = actorHashMap.get(sourceActor);
if(connectedActors.contains(actor)) {
found = true; }
但是......如果我正在寻找的演员不在HashMap中(即当我必须更深入地找到他时)我该怎么办?我假设我必须从connectedActors列表中选择第一个actor的名称,将其作为新键插入HashMap,并获取他与他一起玩的所有actor以插入它们。然后在这个列表中搜索。
但这正是我无法弄清楚的部分。我已经尝试将这些名称存储在图形点头并使用bfs来搜索它们,但是这里也存在同样的问题,只是不知道如何在不创建无限循环的情况下“降低一级”...有没有人知道如何我能解决这个问题吗?我刚刚开始使用java以及编程,所以它可能很简单,但我只是看不到它:/
答案 0 :(得分:0)
首先,我会使用Set
存储某人玩过的演员:
Map<String, Set<String>> actorHashMap = ...
而不是List
以避免重复的名称。
为了找到2个演员之间的分离程度 我将从一个演员开始,并生成所有被分隔的演员 1,2,3 ...度。我会确定最大搜索深度,但如果演员数量不是太大,则可能没有必要。
String actor = "Johnny Depp";
String targetActor = "John Travolta";
Map<String, Integer> connectedActorsAndDepth = new HashMap<String, Integer>();
Integer depth = 1;
Set<String> actorsAddedAtCurrentDepth = actorHashMap.get(actor);
for (String otherActor : actorsAddedAtPrecedingDepth) {
if (otherActor.equals(targetActor)) return depth;
connectedActorsAndDepth.put(otherActor, depth);
}
Set<String> actorsAddedAtPrecedingDepth = actorAddedAtCurrentDepth;
Integer maxDepth = 10;
while (++depth < maxDepth) {
actorsAddedAtCurrentDepth = new HashSet<String>():
for (String otherActor : actorsAddedAtPrecedingDepth) {
if (otherActor.equals(targetActor)) return depth;
if (!connectedActorsAndDepth.contains(otherActor)) {
actorsAddedAtCurrentDepth.add(otherActor);
connectedActorsAndDepth.put(otherActor, depth);
}
}
actorsAddedAtPrecedingDepth = actorsAddedAtCurrentDepth;
}
我并不认为它是最有效的算法。上面的代码中也可能存在错误。