我是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
}
}
如果有人可以给我一些很好的指导,
谢谢,凯特
答案 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)
这是什么
此外,您还会问自己__ ->
是什么。
好吧,__
只是一个有效的变量名,用来表示“嘿,我不需要”
->
(箭头)是lambda表达式的一部分,该表达式基本上是一个内联函数
答案 1 :(得分:0)
建议computeIfAbsent
的{{3}}是正确的,但您的课程讲师所寻找的可能不正确。她/他可能希望您提供更多的编码,就像我们在最近添加新方法之前在实际工作中所做的那样。
您需要添加到addTeam(String division, Team team)
的老式LeagueAdmin
方法会询问地图是否具有用于分隔字符串的键。如果没有这样的键,请添加一个,并在其中添加了您所讨论的团队的新的空List
团队作为其值。如果有这样的键,请获取其值List
,然后将有问题的团队添加到该列表中。
作为一项家庭作业,要进行学习,您需要为此付出一些努力,而不是复制一些现有代码。 研究Answer by LppEdd和Map
接口的JavaDoc 。按照我上面的散文作为伪代码来逐步理解逻辑。确保您了解每个类的思想,尤其是List
(也称为 dictionary 或 associative array )。在纸上画一个图,想象一下我上面概述的每个步骤。
因此,一个联赛对象拥有一个Map
对象。该地图包含一组键,每个键都是一个部门名称(在您的情况下为String
,在实际工作中更可能为Division
类)。成为地图中的键意味着每个部门的名称都会带您到List
对象,即团队的集合。 List
使项目保持添加的顺序。顺便说一句,Set
也想在这里工作。
在此图中注意List
对象之一是空的,这意味着它尚未分配任何团队。空列表不是不是。空列表是什么。空列表仍然是有效对象,就像没有任何水果的水果篮仍然是篮子一样。如果尚未将任何列表(空列表或其他列表)分配给映射中的键,则该键指向null
,其中null
的确表示“完全没有”。我们在此图中看到,映射中的“ div-z”键还没有分配任何List
对象,因此它没有指向null
。