Java 在ArrayList中扫描具有相同字段的对象

Java 在ArrayList中扫描具有相同字段的对象,java,object,for-loop,arraylist,Java,Object,For Loop,Arraylist,我有一个简单的类创建者: public class Creator { private String name; public Creator(String name) { this.name = name; } public String getName() { return name; } } 我正在扫描一个XML文档以生成更多的Creator对象,这些对象将添加到ArrayList中 但是,如果我的Array

我有一个简单的类创建者:

public class Creator {

    private String name;

    public Creator(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

}
我正在扫描一个XML文档以生成更多的Creator对象,这些对象将添加到ArrayList中

但是,如果我的ArrayList中已有一个具有相同“name”字段的现有创建者,我不希望添加新的创建者。下面是我的尝试,但最好的方法是什么

ArrayList<Creator> creators = new ArrayList<>();
String text; // name from XML input    

boolean makeCreator = true;
for(Creator creator : creators) {
    if(creator.getName().equals(text)) {
        makeCreator = false;
    }
}
if(makeCreator == true) {
    creators.add(new Creator(text));
}
ArrayList创建者=新建ArrayList();
字符串文本;//来自XML输入的名称
布尔makeCreator=true;
for(创建者:创建者){
if(creator.getName().equals(text)){
makeCreator=false;
}
}
if(makeCreator==true){
添加(新创建者(文本));
}

您只想查看是否已经存在同名的Creator对象,对吗

如果是,只需覆盖等于,即:

public boolean equals(Object object) {
    if (object instanceof Creator) {
        return name.equalsIgnoreCase(((Creator) object).name);
    }
    return false;
}

然后测试现有的justdo
creators.contains(newcreator(name))

您只想查看是否已经存在同名的Creator对象,对吗

如果是,只需覆盖等于,即:

public boolean equals(Object object) {
    if (object instanceof Creator) {
        return name.equalsIgnoreCase(((Creator) object).name);
    }
    return false;
}

然后测试现有的justdo
creators.contains(newcreator(name))

一种方法是使用不允许重复的集合实现(如HashSet)

这需要在数据类中实现equals和hashcode方法

public class Creator {

private String name;

public Creator(String name) {
    this.name = name;
}

public String getName() {
    return name;
}

public int hashCode() {
    return name.hashCode();
}

public boolean equals(Object other) {
   if (!(other instanceof Creator)) {
      return false;
   }
   return Objects.equals(((Creater)other).name, name);
}
} 请注意,您可能希望更好地实现这两种方法

问题是-您已经拥有的
creators
集合是什么?你迭代它,然后创建一个新的列表

所以答案可能是

Set<Creator> uniqeCreators = new HashSet<>(creators);
Set uniqeCreators=新HashSet(创建者);

哦,是的,
如果(makeCreateor==true)
是多余的,
如果(makeCreator)
足够了

一种方法是使用一个不允许重复的集合实现(例如HashSet)

这需要在数据类中实现equals和hashcode方法

public class Creator {

private String name;

public Creator(String name) {
    this.name = name;
}

public String getName() {
    return name;
}

public int hashCode() {
    return name.hashCode();
}

public boolean equals(Object other) {
   if (!(other instanceof Creator)) {
      return false;
   }
   return Objects.equals(((Creater)other).name, name);
}
} 请注意,您可能希望更好地实现这两种方法

问题是-您已经拥有的
creators
集合是什么?你迭代它,然后创建一个新的列表

所以答案可能是

Set<Creator> uniqeCreators = new HashSet<>(creators);
Set uniqeCreators=新HashSet(创建者);

哦,是的,
如果(makeCreator==true)
是多余的,
如果(makeCreator)
足够了

正如其他人所指出的,您可以覆盖
Creator
中的
equals
hashCode
并使用
creators.contains()

另一种方法是使用
集合

Set Set=newhashset();
列表创建者=新建ArrayList();
...
字符串文本=(以某种方式获取)
如果(设置添加(文本))
添加(新创建者(文本));
这取决于
Set。如果
字符串
被添加到
集合
中,则add
返回
true
,否则返回false


这比只使用
ArrayList
的解决方案更有效,因为
HashSet的
contains
O(1)
,而
ArrayList的
contains
O(n)
。但是,这只可能对长列表产生明显的影响。

正如其他人所指出的,您可以在
Creator
中覆盖
equals
hashCode
,并使用
creators.contains()

另一种方法是使用
集合

Set Set=newhashset();
列表创建者=新建ArrayList();
...
字符串文本=(以某种方式获取)
如果(设置添加(文本))
添加(新创建者(文本));
这取决于
Set。如果
字符串
被添加到
集合
中,则add
返回
true
,否则返回false


这比只使用
ArrayList
的解决方案更有效,因为
HashSet的
contains
O(1)
,而
ArrayList的
contains
O(n)
。但是,这只可能对长列表产生明显的影响。

您需要的数据结构是一个。该定义规定:

地图不能包含重复的键;每个键最多可以映射到一个 价值观

因此,只需在名称上键入它。任何时候您需要
创建者
自己,都可以通过访问它们,如果绝对需要
阵列列表
,则可以使用将生成的
集合
转换为
阵列列表
。如果维护插入顺序很重要,请使用

Map creators=newlinkedhashmap();
字符串文本;//来自XML输入的名称
创建者。putIfAbsent(文本,新创建者(文本));
ArrayList creatorList=新的ArrayList(creators.values());

这避免了需要覆盖
equals
/
hashCode
,除了额外的代码/维护之外,如果您开始向
创建者添加其他属性,这可能会导致问题。它还为插入提供了
O(1)
性能,这比
O(n)
ArrayList
中检查具有优势,尽管直接针对
值()的索引查询将受到影响(如果这很重要的话),因为它们将是
O(n)
您需要的数据结构是一个。该定义规定:

地图不能包含重复的键;每个键最多可以映射到一个 价值观

因此,只需在名称上键入它。任何时候您需要
创建者
自己,都可以通过访问它们,如果绝对需要
阵列列表
,则可以使用将生成的
集合
转换为
阵列列表
。如果维护插入顺序很重要,请使用

Map creators=newlinkedhashmap();
字符串文本;//来自XML输入的名称
创建者。putIfAbsent(文本,新创建者(文本));
ArrayList creatorList=新的ArrayList(creators.values());
这避免了需要覆盖
equals
/
hashCode
,除了额外的co