2

嗨,我正在弄清楚为什么这段代码不能按照我想要的方式工作..

我基本上想要的是一个随机对象,它有一个 char 和一个 int 生成并将其放入 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;
    } 

一旦我查看了数组列表,仍然有一些重复,例如 [A1,A1,A2] 或 [A2,A2,A3]

非常感谢!

4

4 回答 4

3

为了使该contains(rn)方法起作用,RegistrationNumber必须重写equals. 否则,两个具有相同信息的不同对象将不会被认为是相同的。

当您覆盖时equals,您还需要覆盖hashCode,因为java.Object的合同要求您同时覆盖两者。

最后,您可以考虑使用该LinkedHashSet集合进行注册:它为您提供可预测的迭代顺序,同时自动防止重复。当然,您仍然需要覆盖equalsand hashCode

于 2013-03-04T14:28:12.767 回答
0

RegistrationNumber类必须实现equals()and hashCode()

我建议首先覆盖这些方法,然后使用 HashSet,它会给你一个不允许重复的 Set。

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + num;
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    RegistrationNumber other = (RegistrationNumber) obj;
    if (num != other.num)
        return false;
    return true;
}
于 2013-03-04T14:29:00.893 回答
0

ArrayLists 的contains方法需要使用equals方法重载,告诉集合它将如何将此对象与现有对象进行比较(因此能够找到重复项)

@Override
public boolean equals(Object obj) {
  if (this == obj)
    return true;

  if (obj == null)
    return false;

  if (getClass() != obj.getClass())
    return false;

  final RegistrationNumber other = (RegistrationNumber ) obj;

  if (num != other.num && letter != other.letter) 
    return false;

  return true;
}
于 2013-03-04T14:29:22.060 回答
0

默认情况下, contains 方法使用类的 equals 方法。如果 equals 没有被覆盖,它就像你使用了 "==" 运算符一样。这将测试它是否是同一个对象;不是具有相同内容的对象。

您需要做的是覆盖 RegistrationNumber 类中的 equals() 方法,因此它测试成员相等性,而不是引用相等性。

于 2013-03-04T14:30:10.027 回答