我有以下类(class):
class Sport {
private String sportsName;
private List<People> peopleWhoPlayThisSport;
//...
}
class People {
private String name;
private long uniqueId;
// ...
}
我的输入是运动对象的列表,为简单起见,请考虑以下示例:
sport1 - Football, <Sam, Dylan>
sport2 - Basketball, <Tyler, John>
sport3 - Baseball, <Carter, Dylan>
sport4 - Hockey, <Kane, Michael>
sport5 - Soccer, <Carter, Frank>
我必须创建一个
List<List<>>
,以使内部列表是所有具有至少1个公共(public)玩家的体育项目(在这里适用Transitive属性)。在上面的示例中,输出应为<<sport1,sport3,sport5> , <sport2> , <sport4>>
对解决此和/或伪代码有什么建议吗?
最佳答案
对我来说听起来像是图形问题。
我要做的是:
因此,图形将以这种方式增长:
和“应用体育”:
==>(足球,棒球,足球),(篮球),(曲棍球)
编辑:
您可以选择优化算法,以使每个组件都记住与之相关的运动。换句话说,创建边时,将运动添加到组件的运动集合中。然后,将不再需要“应用体育”步骤。一个简单的规则是,当两个组件连接在一起时,您将在添加新运动之前合并运动集合。然后该算法将执行:
请注意,没有必要使用图表。您仍然可以使用简单的集合,但是图形似乎是最干净的方法,也是算法的最佳选择。它还以自然的方式对数据进行建模,因此还具有进一步的可扩展性-例如,您可以进一步找出Sam为何与Carter在一起(因为他们的共同 friend Dylan与他们一起从事不同的运动)。