有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

参考团队对象列表的hashmap Java足球队地图

我是Java新手,目前正忙于一个作业问题

我需要为LeagueAdmin类创建一个名为addTeam()的方法,它接受两个参数,不返回任何值。我得到了标题:public void addTeam(字符串部门,团队)

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

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

如果列表不存在,则应创建一个新的空团队列表,并将新团队添加到其中,然后应在团队中创建一个新的键值对,以分区为键,以新列表为值

我的代码如下:

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) 个答案

  1. # 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);
        }
    }
    

    自Java8以来,Map接口公开了一个新方法

    computeIfAbsent(Key, Function)
    

    它的作用是

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

    另外,你会问自己什么是__ ->
    嗯,__只是一个有效的变量名,用于表示“嘿,我不需要这个”

    ->(箭头)是lambda表达式的一部分,它基本上是一个内联函数

  2. # 2 楼答案

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

    需要添加到LeagueAdmin的老式addTeam(String division, Team team)方法会询问map是否有用于除法字符串的键。如果没有这样的键,添加一个,并将一个新的空的List团队作为其值,您已经添加了相关的团队。如果有这样一个键,则检索其值aList,然后将有问题的团队添加到该列表中

    作为一项家庭作业,要完成学习,你需要努力解决这个问题,而不是复制一些现有的代码研究^{}^{}接口的JavaDoc。按照我上面的文章作为伪代码来引导您了解逻辑。确保您理解每个类背后的思想,尤其是key-value pairing of a map(也称为字典关联数组)。在纸上画一张图表,想象我上面概述的每一步

    所以一个league对象持有一个Map对象。该映射包含一组键,每个键都是一个部门名称(在您的情况下是String,在实际工作中更可能是Division类)。作为映射中的一个键意味着每个部门名称将引导您找到一个List对象,一个团队集合。一个List按项目添加的顺序保存项目。顺便说一句,ASet也希望在这里工作

    请注意,在这个图中,List对象中的一个是空的,这意味着它还没有分配任何团队。空列表是无;空名单是一种东西。空列表仍然是一个有效对象,就像一个没有任何水果的果篮仍然是一个果篮一样。如果尚未为映射中的键分配任何列表(空列表或其他列表),则键指向null,其中null实际上表示“什么都没有”。我们在这个图中看到,映射中的“division-z”键还没有被分配任何List对象,所以它没有指向任何对象,null

    diagram of a "League" object holding a map of division (the key) to list of teams (the value)