比较列表中对象的属性

Compare attributes of objects in a list

我的 Minecraft 插件有问题。我想将播放器的对象添加到列表中。在此之前,我想检查该播放器是否已存在于我的列表中。

这里有一个例子:

public class Player{

    public String playerName;
    public int Count = 0;

    public Player(String name){

         playerName = name;
    }
}

这里主要class:

public class mainClass{ 
   List<Player> = PlayerList;
   [...]
   if(!(*An object with attribute examplename in List exist*)){
        Player p = new Player("eamplename") 
        PlayerList.Add(p);
   }
}

我会建议两种方法来解决您的问题。第一个是坚持使用 List.

的方法
    List<Foo> list = new ArrayList<Foo>();

    boolean hasMyItem = false;
    String newName = "hello world";

    for (Foo foo : list)        // iterate over each item in the list
    {
        if (foo.name.equals(newName))
        {
            hasMyItem = true;
            break;            // get out of for loop
        }
    }

    if (!hasMyItem)
    {
        list.add(new Foo(newName));
    }
    else
    {
        // the player is already in the list ...
    }

在此代码段中,我们遍历列表中的所有项目,直到我们发现播放器已经存在。如果您的列表中不存在这样的玩家,它将退出,hasMyItem 的值为 false,在这种情况下,您将把新玩家添加到列表中。

迭代列表中的所有项目是一种常用的方法,了解它绝对是件好事。但是,您可以考虑使用另一种名为 Map<Key, Value> 的数据结构。 MapKeyValue 相关联,并将它们像列表一样存储在 Map 中。

您可以将 Map<Key, Value> 视为标记项目。 Key 是每个项目的标签。假设你的桌子上有一堆笔记本,你想找一个数学笔记。如果你知道你的数学笔记的独特标签,比如封面上的一些文字或图片,你可以很容易地找到它。在您的示例中,Key 将是用户名,Value 将是玩家。

Map有什么好处?它提供了一种简单的方法来查找您拥有的 Key 值。如果使用 Map.

可以更简化上面的代码
    Map<String, Foo> map = new HashMap<String, Foo>();

    Foo f1 = new Foo("name1");
    Foo f2 = new Foo("name2");
    Foo f3 = new Foo("name3");

    map.put("name1", f1);
    map.put("name2", f2);
    map.put("name3", f3);

    // will return true and this if statement will be executed
    if (map.containsKey("name1"))
    {
        // will be executed
    }

    // will return false because you don't have and this if statement will not be executed
    if (map.containsKey("some new name"))
    {
        // will not be executed
    }

还有Map<K,V>提供的其他有用的方法,可以在here中找到。

作为旁注,尽可能将每个 class 成员声明为 private,而不是 default(当您不指定任何内容时)或 public.有很多关于为什么应该这样做的讨论,但基本上是为了保护您自己的代码不受他人影响。您可以很容易地搜索它,但这里有一些指向它的链接。 Link1 Link2

我希望这能给你一些好的起点。

既然有人指出我对Set的使用不正确,我决定换一种方法(仍然使用重载的equals方法)

public class Player{
    public String playerName;
    public int Count = 0;
    public Player(String name){
        playerName = name;
    }
    public boolean equals(Player p){
        if(this==p) return true;
        if(this.playerName.equals(p.playerName) return true;
        return false;
}

public class mainClass{
    ArrayList playerList;
    public static void main(String[] args){
        playerList = new ArrayList<Player>();
        Player p = new Player("eamplename");
        checkList(p);
    }
    //check Player object against list and add if not exist
    //if desired, the returned boolean can confirm whether or not
    //player was successfully added
    public static boolean checkList(Player player){
        for(Player p : playerList){
            if(p.equals(player)) return false;
        }
        playerList.add(player);
        return true;
}