【问题标题】:Determining type of Java collections to use确定要使用的 Java 集合的类型
【发布时间】:2016-08-04 16:02:17
【问题描述】:

这是我的问题:

考虑一下,我有一个很大的棒球信息列表。此列表中的每个条目都是一名球员击出的本垒打,由他的名字和他击出本垒打时所在的球队记录。 它看起来像:

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

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

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

【问题讨论】:

    标签: java data-structures collections


    【解决方案1】:

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

    在您的情况下,您应该有一个 Player 类,其中包含一个 Set 或 List 的本垒打,这也将是一个自定义类。

    class Player{
        List<HomeRun> homeRuns;
    }
    
    class HomeRun{
        String team;
    }
    

    现在您可以让 Player 实现 Comparable&lt;Player&gt; 并按照 homeRuns 集合的大小对它们进行排序,然后您可以将您的玩家存储在 TreeSet 中。

    【讨论】:

      【解决方案2】:

      怎么样...

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

      然后在其他地方,你可以有一个 Player 类型的 List。

      但我也同意 PNS 的说法,并且我会阅读数据结构和 POJO。

      【讨论】:

      • 这是我认为我应该走的方向。最好为我的程序的各个部分创建类,而不是尝试制作一大组令人困惑的链接集合
      【解决方案3】:

      编程就是这样。许多不同的解决方案,因此这取决于您所说的需要。如果您知道除了您在问题中提供的信息之外,您不需要更多信息,那么您的列表和地图解决方案应该没问题。但是,如果您在某个时候需要获得每支球队曾经得分的本垒打数,或者必须添加本垒打是在哪个赛季进行的,或许可以考虑该怎么做。

      我建议研究数据库设计,这可能不是您所需要的,但在进行可扩展设计方面有很多知识。

      【讨论】:

        【解决方案4】:

        一个好的 DS 可以是:

        HashMap<Player, HashMap<Team, Integer>>
        

        对于每个玩家,您可以在 O(1) 时间内获得另一个 HashMap,其键集可以被迭代以找到该玩家效力的球队以及该球队的本垒打。

        如果您想按排序顺序打印每个球员的本垒打,可以使用其他变体。此外,O(1) 对您来说可能有点过头了。也许 O(n) 对你有好处。您必须更具体地了解所需数据结构的用例。

        【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-25
        • 2012-06-03
        • 2013-10-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多