比较列表中对象的属性

时间:2016-03-05 09:04:48

标签: java list minecraft bukkit

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

这里有一个例子:

public class Player{

    public String playerName;
    public int Count = 0;

    public Player(String name){

         playerName = name;
    }
}

这里是主要课程:

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

2 个答案:

答案 0 :(得分:2)

我建议两种方法来解决你的问题。第一个是坚持使用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<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

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

我希望这可以给你一些很好的起点。

答案 1 :(得分:1)

由于有人指出我对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;
}