检查Java中的ArrayList中是否存在Object

Mar*_*ann 5 java arraylist object bukkit

我有以下对象列表:

private List<Object> teamlist = new ArrayList<Object>();
Run Code Online (Sandbox Code Playgroud)

我正在向列表中添加对象,如下所示:

teamlist.add(new MCWarTeam(args[0], joinkey));
Run Code Online (Sandbox Code Playgroud)

现在列表中的对象没有名称,但可以使用列表引用,对吧?在向列表中添加新元素之前,如何检查具有特定属性的对象是否已存在?这是Objects的构造函数:

public MCWarTeam(String teamname, String joinkey){
    this.teamname = teamname;
    this.joinkey = joinkey;
}
Run Code Online (Sandbox Code Playgroud)

我想检查是否已经有一个名为teamname的团队.或者,是否有更好的方法来存储对象?之前,我只是使用HashMap添加了teamname和joinkey,它运行得很好,但是使用Objects计算它将是一种更好的方法.

以下是事件处理程序的重要代码:

        else if (cmd.getName().equalsIgnoreCase("createTeam")) {
        if (args.length > 0 && args.length < 3) {
            String joinkey = "";
            if (args.length > 1)
                joinkey = args[1];

            String teamname = args[0];

            MCWarTeam newTeam = new MCWarTeam(teamname, joinkey);
            if (!teamlist.containsKey(teamname)) {
                teamlist.put(teamname, newTeam);
                sender.sendMessage("Created new team \"" + teamname + "\" with join key \"" + joinkey + "\" successfully! Teams:");

                sender.sendMessage("All teams:");
                for (String key : teamlist.keySet()) {
                    sender.sendMessage(key);
                }

            } else
                sender.sendMessage("Team already exists!");
            return true;
        }
        return false;
    }

    else if (cmd.getName().equalsIgnoreCase("joinTeam")) {
        if (args.length > 0 && args.length < 3) {
            String joinkey = "";
            if (args.length > 1)
                joinkey = args[1];

            String teamname = args[0];

            if (teamlist.containsKey(teamname)) {
                String teamKey = teamlist.get(teamname).getJoinKey();
                if (joinkey == teamKey) {
                    teamlist.get(teamname).addPlayer(playername);
                    Bukkit.broadcastMessage("MCWar: " + playername + " joined Team \"" + teamname + "\" successfully!");
                } else
                    sender.sendMessage("Join key incorrect!");
            } else {
                sender.sendMessage("Team doesn't exist! Teams:");
                for (String key : teamlist.keySet()) {
                    sender.sendMessage(key);
                }

            }
            return true;
        }
        return false;
    }
Run Code Online (Sandbox Code Playgroud)

基本上,如果它返回false,则用户将收到一条消息,说明他输入的命令的正确用法.

das*_*ght 6

Java List<T>有一个boolean contains(Object)方法,当您希望避免重复时,这种方法非常方便:

if (!teamlist.contains(newTeam)) {
    teamlist.add(newTeam);
} 
Run Code Online (Sandbox Code Playgroud)

MCWarTeamclass必须实现equals才能使其工作.覆盖时equals,您还必须覆盖hashCode.

@Override
public boolean equals(Object obj) {
    if (!(obj instanceof MCWarTeam))  {
        return false;
    }
    MCWarTeam other = (MCWarTeam)obj;
    return teamname.equals(other.teamname)
        && joinkey.equals(other.joinkey);
}
@Override
public int hashCode() {
    return 31*teamname.hashCode()+joinkey.hashCode();
}
Run Code Online (Sandbox Code Playgroud)

我只是希望检查是否有Object与同teamname已经存在,但不关心joinkey

如果joinkey不是影响相等性的对象状态的一部分,那么将它作为字段的对象的一部分保持通常不是一个好主意.例如,如果joinkey是用于将团队"连接"到其他事物的瞬态事件,那么使用HashMap<String,MCWarTeam>,joinkey作为地图的关键字并joinkey从中删除MCWarTeam应该是一个好主意.


Mic*_*nic 4

根据描述和您对其他答案的评论,不使用 a 似乎是个好主意List,而是将数据存储在 a 中Map<String, MCWarTeam>,它将团队名称映射到MCWarTeam对象中:

private Map<String, MCWarTeam> teams = new HashMap<>();
Run Code Online (Sandbox Code Playgroud)

您可以添加一个团队,检查是否已存在同名团队,如下所示:

String teamName = args[0];

if (!teams.containsKey(teamName)) {
    teams.put(teamName, new MCWarTeam(teamName, joinKey));
} else {
    // do what you want when the team name was already in the map
}
Run Code Online (Sandbox Code Playgroud)

MCWarTeam根据团队名称检索对象(例如访问joinKey属性)很容易:

String joinKey = teams.get(teamName).getJoinKey();
Run Code Online (Sandbox Code Playgroud)

请注意,使用这种方法时,您不应该实现equalsor hashCodein MCWarTeam,因为您不需要它;由于您的地图键是团队名称,因此对已经具有明确定义和语义的对象containsKey进行操作。StringequalshashCode