比较列表中对象的属性
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>
的数据结构。 Map
将 Key
与 Value
相关联,并将它们像列表一样存储在 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;
}
我的 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>
的数据结构。 Map
将 Key
与 Value
相关联,并将它们像列表一样存储在 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;
}