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;
}
然后测试现有的justdocreators.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