将2个集合存储在同一hashmap / set java中

问题描述 投票:0回答:1

因此,对于我的学校,我必须编写一个Java程序来跟踪运动员在2个单独的课程(砾石和草地课程)上跑过的时间。它们具有不同的长度和特殊条件。但是,它们必须放在同一个集合中。我将为此使用ArrayList,但是这是我们得到的第二个Java课程,并且由于我们上次使用ArrayList,我们现在必须使用其他方法。他们教给我们的两个新集合是HashMap和HashSet。我以为我会使用Hashmap,将两种类型的音轨用作键,将跑步者设置的时间用作值。但是有一个问题。哈希图每个键只能存储1个值,每个键= 1个GrassRound或GravelRound对象。我真的迷失了如何解决这个问题。我们也了解了包装器,我以为可以使用它,但是在最初创建包装器后找不到有关如何将另一个对象添加到包装器的任何信息。

我的代码(或我想要实现的)

import java.sql.Wrapper;
import java.util.HashMap;

public class Athlete
{
    private String name;
    public HashMap<String, Wrapper> rounds;
    public Athlete(String name)
    {
        this.name = name;
        this.rounds = new HashMap<>();
    }
    public void addRound(String type, Round round)
    {
        switch(type)
        {
            case "grass":
                //Add a grass round to the Hashmap please
                break;
            case "gravel":
                //Add a gravel round to the Hashmap please
                break;
        }

    }
    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
        this.name = name;
    }

    public HashMap<String, Wrapper> getRounds()
    {
        return rounds;
    }
}

[另外,GrassRound和GravelRound都是Round类的扩展对象,所以我可以告诉我的程序它将接收Round对象,然后将其喂入Gravel或Grassround对象吗?我最初有2种方法添加草皮或砾石皮,但他们不喜欢这种方法。

编辑:这是完整作业的问卷,所以每个人都有适当的背景:

De Sperwers,艾门(Emmen)的地方体育俱乐部,目前对所有公关和运动员的距离都有很大的管理。为了摆脱所有书面工作,他们希望有一个简单的应用程序来注册所有数据。对于每个运动员,他们都想查看该运动员在那段时间跑了几轮。有不同的赛道可供选择:一条300m的草地赛道和一个400m的碎石赛道。为补偿草地赛道的难度,该赛道的运行时间将减少5秒。俱乐部还希望知道俱乐部记录员的赛道:在某些轨道上是最快的。对于每个运动员应计算:

•总距离,以公里为单位。•每圈平均时间。

•最大速度(m / s)。

•运动员跑步的总时间。

俱乐部希望展示最快的运动员及其最快的圈速。

java hashmap hashset
1个回答
0
投票

除非您计划继续使用SQL数据库,并且需要特定的用例暗示使用java.sql.Wrapper,否则请not使用该接口。

“包装对象”不一定是java.sql.Wrapper的实例。

这是一个对象的一般概念,它包含一些其他对象(并且通常以某种方式增强其功能)。

在您的情况下,您可以定义一些包含两个RoundWrapper对象的Round类,并将其用作地图中的值类型。

如果您认为可以将Round与您的Athlete类保持构图关系,您可能会失去包装器,并拥有包含每个Set<Round>的多态Round,作为Athlete的字段。

在那种情况下,由于Collection几乎不对元素或类型的数量施加任何限制(例如HashSet仅阻止重复的元素),因此您可能要强制执行2门课程的规则-每个课程各不相同类型-每个运动员的单一add方法,在确定是否将其添加到Round之前检查给定Set

但是我认为,最好的解决方案是将Athlete与各回合解耦,并使用Map<Athlete, Set<Round>>Map<Athlete, RoundWrapper>-如果您想更轻松地具体实施回合和他们的类型。

您需要Athlete类才能在equals中正确实现hashCodeHashMap,但这可能是对象的最佳表示形式:

  • 地图键是运动员,每个人都与众不同
  • 一个运动员没有“拥有”回合,但被映射到他们执行的2个回合中

[最后,它还取决于您要如何访问Map,即您可能要搜索的内容:运动员进行的回合比赛(当时上述设计有效),或更确切地说,运动员进行的逐回合比赛(在这种情况下,您可以反转关系并使用Map<RoundWrapper, Athlete>,这将需要RoundWrapper来实现hashCodeequals)。

© www.soinside.com 2019 - 2024. All rights reserved.