引用Team对象列表的Java Football Team Map

时间:2019-03-03 18:13:59

标签: java hashmap

我是Java的新手,目前遇到分配问题。

我需要为LeagueAdmin类创建一个名为addTeam()的方法,该方法带有两个参数并且不返回任何值。我得到的标题是:public void addTeam(String division,Team team)

该方法应检查团队地图中是否已存在该部门的列表。

如果该列表存在,则应将新团队添加到该部门的现有团队列表中。

如果该列表不存在,则应创建一个新的Team空列表并将新的Team添加到其中,然后应在以除法为键的团队中创建一个新的键值对,并以列出作为值。

到目前为止,我的代码如下:

import java.util.*;
public class LeagueAdmin
{
    public Map<String, List<Team>> teams;
    /**
    * Constructor for objects of class LeagueAdmin
    */
    public LeagueAdmin()
    {
        this.teams = new HashMap<String, List<Team>>();
    }
}

我有如下单独的课程:

public class Team
{  
    private String name;
    private String division;
    private int won;
    private int drew;
    private int lost;
    // no need to record points as = 3*won + drew   


    /**
    * Constructor for objects of class Team
    */
    public Team(String aName, String aDivision)
    {
        name = aName;
        division = aDivision;
        // no need to set won, drew and lost to 0
    }
}

如果有人可以给我一些很好的指导,

谢谢,凯特

2 个答案:

答案 0 :(得分:1)

在回答您的问题之前,有一些建议。

  • 在可能时始终将局部变量和字段声明为final
  • 始终格式化代码。似乎是多余的,但这是我不常做的事情
  • 初始化final字段直接,而不是在构造函数内部初始化
  • 不公开字段,这些字段是实现细节的一部分

编辑:由于您可能需要简化的版本,因此我还要添加,但请继续阅读我的所有答案,这很有趣!

请遵循代码中的注释以了解流程。

public class LeagueAdmin {
    private final Map<String, List<Team>> teams = new HashMap<String, List<Team>>();

    public void addTeam(final String division, final Team team) {
        // We retrieve the team list, if any
        List<Team> list = map.get(division);

        // We check if the list was already there, or we have to create a new one
        if (list == null) {
           // The list is null, we need to insert a new one!
           list = new ArrayList<>();
           map.put(division, list);
        }

        // We add the team to the list
        list.add(team);
    }
}

现在,对于一个更“简化”的新版本,它的功能与上述版本完全相同,实现方式将是

public class LeagueAdmin {
    private final Map<String, List<Team>> teams = new HashMap<String, List<Team>>();

    public void addTeam(final String division, final Team team) {
       teams.computeIfAbsent(division, __ -> new ArrayList<>()).add(team);
    }
}

从Java 8开始,Map接口公开了一种新方法

computeIfAbsent(Key, Function)

这是什么

  1. 尝试获取与输入键关联的值
  2. 如果未找到任何值,请使用Function参数关联一个新值
  3. 返回关联的值

此外,您还会问自己__ ->是什么。
好吧,__只是一个有效的变量名,用来表示“嘿,我不需要”
->(箭头)是lambda表达式的一部分,该表达式基本上是一个内联函数

答案 1 :(得分:0)

建议computeIfAbsent的{​​{3}}是正确的,但您的课程讲师所寻找的可能不正确。她/他可能希望您提供更多的编码,就像我们在最近添加新方法之前在实际工作中所做的那样。

您需要添加到addTeam(String division, Team team)的老式LeagueAdmin方法会询问地图是否具有用于分隔字符串的键。如果没有这样的键,请添加一个,并在其中添加了您所讨论的团队的新的空List团队作为其值。如果有这样的键,请获取其值List,然后将有问题的团队添加到该列表中。

作为一项家庭作业,要进行学习,您需要为此付出一些努力,而不是复制一些现有代码。 研究Answer by LppEddMap接口的JavaDoc 。按照我上面的散文作为伪代码来逐步理解逻辑。确保您了解每个类的思想,尤其是List(也称为 dictionary associative array )。在纸上画一个图,想象一下我上面概述的每个步骤。

因此,一个联赛对象拥有一个Map对象。该地图包含一组键,每个键都是一个部门名称(在您的情况下为String,在实际工作中更可能为Division类)。成为地图中的键意味着每个部门的名称都会带您到List对象,即团队的集合。 List使项目保持添加的顺序。顺便说一句,Set也想在这里工作。

在此图中注意List对象之一是空的,这意味着它尚未分配任何团队。空列表不是不是。空列表是什么。空列表仍然是有效对象,就像没有任何水果的水果篮仍然是篮子一样。如果尚未将任何列表(空列表或其他列表)分配给映射中的键,则该键指向null,其中null的确表示“完全没有”。我们在此图中看到,映射中的“ div-z”键还没有分配任何List对象,因此它没有指向null

key-value pairing of a map