繁体   English   中英

表示团队和玩家的数据结构

[英]Data structure to represent Teams and Players

有一个Team对象,其中包含播放器List<Players> 所有团队都需要存储在Teams集合中。

条件:

  1. 如果一个新的播放器需要被添加到一个特定的团队,该特定车队从检索TeamsPlayer需要被添加到Players的那支球队的名单

  2. 集合Teams中的每个Team对象都需要根据team name进行唯一

  3. 集合中的Team对象需要根据team name进行排序。

注意事项:

在这种情况下,当我使用List<Team> ,我可以实现1,3。 但是不能满足独特性。

如果我使用TreeSet<Team> 2,3就可以实现。 但由于TreeSet上没有get方法,因此无法选择特定的团队

所以我最终使用了TreeMap<teamName,Team> 这使得所有1,2,3成为可能。 但我认为这不是一个好方法

哪种数据结构适用于此用例? 最好形成Java集合。

如果您愿意,可以使用TreeSet。 但是,如果您要使用Set接口,则可以使用remove(object o)而不是get。 您将删除该对象,进行修改,然后将其添加回集合中。

我认为扩展(即创建子类) ArrayList或LinkedList并覆盖set(),add(),addAll(),remove()和removeRange()方法,以确保它们的唯一性和排序条件(不变量) )将是一个非常干净的设计。 您还可以在类中实现二进制搜索方法,以快速查找具有给定名称的团队。

如果您不想过于频繁地添加或删除团队,ArrayList是更好的选择。 如果使用二进制搜索(其中n是数组中元素的数量),ArrayList将为您提供O(n)插入和删除,但O(log n)成本用于元素访问并确保唯一性。

有关泛型的子类,请参阅泛型教程

如何使用Guava的MultiMap 更准确地说,是一个SetMultimap 具体来说,是一个SortedSetMultimap 更具体地说,它的TreeMultimap实现(1)。

说明:

  • MultiMapKey不是指单个值 ,而是指向值Collection
    这意味着您可以将单个Team键绑定到多个Player值的集合,以便解决Req1
  • SetMultiMapKey是唯一的。
    这会让你的Req2得到解决。
  • SortedSetMultimap ,还对Values进行排序。
    虽然你没有特别关心它,但它很高兴。
  • TreeMultimapKey及其每个Values集合都已排序。
    这会让你的Req3排序(看看我在那里做了什么?)

用法:

TreeMultimap<Team, Player> ownership = new TreeMultimap<Team, Player>();
ownership.put(team1, playerA);
ownership.put(team1, playerB);
ownership.put(team2, playerC);
Collection<Player> playersOfTeamA = ownership.get(team1); // contains playerA, playerB
SortedSet<Team> allTeams = ownership.keySet(); // contains team1, team2

Gothas:

  • 请记住在Team对象上正确设置equalshashCode以使用其name
    或者,您可以使用静态create(Comparator<? super K> keyComparator, Comparator<? super V> valueComparator) ,如果您不希望更改Team的自然顺序,则会提供特制的比较。 (使用Ordering.natural()让Player比较器保持其自然顺序 - 另一个不错的Guava事物)。 无论如何,请确保它与equals兼容!
  • 屈德宁不是地图,因为put荷兰国际集团新的价值的关键删除之前保持的值(即是整点),所以一定要了解它。 (例如,它仍然认为你不能把键值对两次......)

(1):我不确定是否有SortedSetMultimap就足够了。 在它的Javadoc中,它声明值已经排序,但没有说出键。 有谁知道更好吗?

(2)我向你保证,我不会以任何方式加入番石榴。 我觉得很棒!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM