有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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]

非常感谢


共 (4) 个答案

  1. # 1 楼答案

    默认情况下,contains方法使用类的equals方法。如果equals未被重写,它将充当使用了“==”运算符的角色。这将测试它是否是同一个对象;不是具有相同内容的对象

    您需要做的是重写RegistrationNumber类中的equals()方法,以便它测试成员相等,而不是引用相等

  2. # 2 楼答案

    为了使contains(rn)方法工作,RegistrationNumber必须重写equals。否则,具有相同信息的两个不同对象将被视为不相同

    当您重写equals时,您还需要重写hashCode,因为java.Object的契约要求您同时重写这两个

    <>最后,您可以考虑使用^{}集合来进行注册:它给您一个可预测的迭代顺序,同时自动防止重复。当然,您仍然需要重写equalshashCode

  3. # 3 楼答案

    ArrayList的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;
    }
    
  4. # 4 楼答案

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

    我建议首先重写这些方法,然后使用HashSet,它会给你一个不允许重复的集合

    @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;
    }