2016-08-04 39 views
1

这是我的问题:确定要使用的Java集合的类型

请考虑我拥有大量的棒球信息。这个列表中的每个条目都是一个玩家击中的本垒打,记录他的名字和他在击中本垒打时所在的队伍。 它看起来是这样的:

Player |  Team 
tim    eagles 
john   bears 
frank   lions 
tim    lions 
frank   bears 
john   lions 
john   bears 
tim    eagles 
tim    eagles 
frank   eagles 

我想了解我是如何将存储在每个玩家都有重点列表的形式,这样的数据:值对,其中K =(队名),V = (在为这支球队效力的同时,本垒打的命中数)。这组键:值应该由#本垒打排序。

这只是我想解决问题的方式,但我真的不知道这是否是最好的方法。最终目标是能够吐出另一份表单:

Player | Team | Homeruns 
tim   eagles   3 
john  bears   2 
frank  lions   1 
frank  eagles   1 
john  lions   1 
tim   lions   1 
frank  bears   1 

我该如何去创建这样的数据结构?

我到目前为止的主要想法是:TreeMap的ArrayList,其中每个TreeMap对应一个播放器。

回答

1

......怎么

class Player{ 
    Map<String, Integer> homeRuns; 
} 

然后在其他地方,你可以有类型的球员的列表。

但我也同意PNS所说的,并且我已经阅读了关于数据结构和POJO的内容。

+0

这是我认为我应该去的方向。最好为我的程序的各个部分创建类,而不是试图制作一个令人困惑的链接集合 – ac927

2

通常,嵌套集合不是一个好主意。相反,使用具有其他集合的自定义对象集合。

就你而言,你应该有一个Player类,它有一个本垒打的Set或List,它也是一个自定义类。

class Player{ 
    List<HomeRun> homeRuns; 
} 

class HomeRun{ 
    String team; 
} 

现在你可以让玩家实现Comparable<Player>并通过本垒打集合的大小命令他们,那么你就可以存储你的球员在一个TreeSet。

0

编程就是这样。许多不同的解决方案,因此取决于您所需要的内容。如果您知道您不需要比您在问题中提供的信息更多的信息,则列表和地图的解决方案应该没问题。但是,也许考虑如果你需要某个时间来获得每支球队在本赛季创造的或者不得不补充的本垒打数量,那么该怎么办。

我建议考虑一下数据库设计,这可能不是你所需要的,但在制作可扩展设计方面有很多知识。

0

的一个很好的DS可以是:

HashMap<Player, HashMap<Team, Integer>> 

对于每一个球员,你可以在O得到(1)时间,另一个HashMap中,其专用话机可遍历找到球队本球员发挥和家庭 - 这支队伍的运动量很大。

如果要按排序顺序打印每位玩家的本垒打,还可以使用其他变体。另外,O(1)对你来说可能是一种矫枉过正。也许O(n)会对你有好处。您必须更具体地了解所需数据结构的用例。

+0

谢谢,但我认为最好是为我的程序的部分创建类 – ac927

+0

@ ac927:当然。在我的答案中,'Player'和'Team'只是你必须根据你的应用程序的需求来构建的类(http://stackoverflow.com/a/34071142/1835769)。 – displayName