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

时间:2016-09-27 18:05:18

标签: java algorithm data-structures

Team个对象,其中包含玩家列表List<Players>。所有团队都需要存储在Teams集合中。

条件:

  1. 如果需要将新玩家添加到特定团队,则会从Teams检索该特定团队,并且Player需要添加到该团队的Players列表中

  2. 根据Team

  3. ,集合Teams中的每个team name对象都必须是唯一的 集合中的
  4. Team对象需要根据team name进行排序。

  5. 考虑:

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

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

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

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

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

有关子类化泛型,请参阅generics tutorial

答案 2 :(得分:0)

如何使用番石榴MultiMap?更准确地说,是SetMultimap。具体来说,是SortedSetMultimap。更具体地说,它是TreeMultimap实现(1)。

说明:

  • MultiMap中,Key点不是单值,而是指Collection个值。
    这意味着您可以将单个Team键绑定到多个Player值的集合,以便解析 Req1
  • SetMultiMap中,Key是唯一的 这会让你的 Req2 解决。
  • SortedSetMultimap中,Values也会被排序 虽然你没有特别关心这一点,但是很高兴。
  • TreeMultimap中,Key对其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:

  • 请务必在equals对象上正确设置hashCodeTeam以使用其name
    或者,您可以使用静态create(Comparator<? super K> keyComparator, Comparator<? super V> valueComparator),如果您不希望更改Team的自然顺序,则会提供专门构建的比较。 (使用Ordering.natural()让Player比较器保持其自然顺序 - 另一个不错的Guava事物。在任何情况下,请确保它与equals
  • 兼容
  • MultiMaps不是地图,因为{{1}为某个键的新值会删除之前保存的值(这就是整点),所以请确保您理解它。 (例如,它仍然认为你不能把键值对放两次......)

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

(2)我向你保证,我不会以任何方式加入番石榴。我发现它太棒了!