java生成对象并放入arraylist,无重复项
嗨,我正在弄明白为什么这段代码没有按我希望的方式工作
我基本上想要的是一个随机对象,它有一个char和一个int,生成并将其放入arraylist。但是,如果生成的数字与arraylist中的相同数字匹配,则必须重新生成该数字,并检查该数字是否存在。如果不存在,则会将其添加到arraylist中
private final char letter;
private final int num;
private static Collection<RegistrationNumber> REGISTRATION_NUMBER = new ArrayList<RegistrationNumber>();
private RegistrationNumber(){
Random rand = new Random();
this.num = (1+(rand.nextInt(3)));
this.letter = Character.toUpperCase((char)(rand.nextInt(1)+'a'));
}
public static RegistrationNumber getInstance(){
boolean foo = false;
RegistrationNumber rn = null;
while(!foo){
rn = new RegistrationNumber();
if(!REGISTRATION_NUMBER.contains(rn)){
REGISTRATION_NUMBER.add(rn);
foo=true;
}
}return rn;
}
一旦我浏览了arraylist,仍然会有一些重复,例如[A1,A1,A2]或[A2,A2,A3]
非常感谢
# 1 楼答案
默认情况下,contains方法使用类的equals方法。如果equals未被重写,它将充当使用了“==”运算符的角色。这将测试它是否是同一个对象;不是具有相同内容的对象
您需要做的是重写RegistrationNumber类中的equals()方法,以便它测试成员相等,而不是引用相等
# 2 楼答案
为了使
contains(rn)
方法工作,RegistrationNumber
必须重写equals
。否则,具有相同信息的两个不同对象将被视为不相同当您重写
<>最后,您可以考虑使用^{equals
时,您还需要重写hashCode
,因为java.Object
的契约要求您同时重写这两个equals
和hashCode
# 3 楼答案
ArrayList的
contains
方法需要使用equals
方法重载,告诉集合如何将此对象与现有对象进行比较(从而能够找到重复的对象)# 4 楼答案
RegistrationNumber
类必须实现equals()
和hashCode()
我建议首先重写这些方法,然后使用HashSet,它会给你一个不允许重复的集合