有Team
个对象,其中包含玩家列表List<Players>
。所有团队都需要存储在Teams
集合中。
条件:
如果需要将新玩家添加到特定团队,则会从Teams
检索该特定团队,并且Player
需要添加到该团队的Players
列表中
根据Team
Teams
中的每个team name
对象都必须是唯一的
集合中的 Team
对象需要根据team name
进行排序。
考虑:
在这种情况下,当我使用List<Team>
时,我可以达到1,3。但是不能满足独特性。
如果我使用TreeSet<Team>
2,3就可以实现。但由于TreeSet上没有get
方法,因此无法选择特定的团队
所以我最终使用了TreeMap<teamName,Team>
。这使得所有1,2,3成为可能。但我认为这不是做这件事的好方法
哪种数据结构适用于此用例?最好是Java集合。
答案 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
个集合进行了排序。用法:
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
对象上正确设置hashCode
和Team
以使用其name
。create(Comparator<? super K> keyComparator, Comparator<? super V> valueComparator)
,如果您不希望更改Team的自然顺序,则会提供专门构建的比较。 (使用Ordering.natural()让Player比较器保持其自然顺序 - 另一个不错的Guava事物。在任何情况下,请确保它与equals
!(1):我不确定是否有SortedSetMultimap就足够了。在它的Javadoc中,它声明值已经排序,但没有说出键。有谁知道更好吗?
(2)我向你保证,我不会以任何方式加入番石榴。我发现它太棒了!