2

こんにちは私は、なぜこのコードが私が望んでいたように機能しないのかを理解しています。

私が基本的に必要としているのは、charとintを生成して配列リストに入れるランダムオブジェクトです。ただし、生成されたものが配列リストで同じものと一致する場合は、番号を再度生成し、それが存在するかどうかを確認する必要があります。存在しない場合は、配列リストに追加されます。

    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。そうしないと、同じ情報を持つ2つの異なるオブジェクトは同じとは見なされません。

をオーバーライドするときはequals、もオーバーライドする必要がありますhashCode。これは、java.Objectのコントラクトでは両方を同時にオーバーライドする必要があるためです。

最後に、LinkedHashSet登録にコレクションを使用することを検討できます。これにより、重複を自動的に防止しながら、予測可能な反復順序が得られます。もちろん、それでもオーバーライドする必要がありequalsますhashCode

于 2013-03-04T14:28:12.767 に答える
0

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;
}
于 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 に答える