0

に一意の要素のみを追加する必要がありArrayListます。equalsその目的のためにメソッドをオーバーライドするにはどうすればよいですか?私は次のようなものが欲しいです:

public boolean equals (Object in) {
    if(in == null) {
        return false;
    }
    else if(in instanceof UniqueFruits) {
        // ?? check whether the newly added element exists or not           
        return true;
    }
    else {
        return false;
    }       
} 

新しく追加された要素が存在するかどうかを確認するにはどうすればよいですか?果物の名前を確認する必要があります。

4

3 に答える 3

2

Set実装を使用したいようです。順序が重要でない場合は、を使用してHashSetください。挿入順を維持したい場合は、を使用してLinkedHashSetください。または、自然順序を維持するには、を使用しますTreeSet

いずれの場合も、必ず要素オブジェクトのequalsメソッドをオーバーライドしてください。あなたが持っているものは良いスタートです。チェックした後in instanceof UniqueFruits、にキャストinUniqueFruitsます:

UniqueFruits uf = (UniqueFruits)in;

次に、を使用して関連する各フィールドを順番に確認できます(フィールドがnull許容かどうequalsかを最初に確認してください)。null最新のIDEは、equals自動的に生成するのに役立ちます。最初に自分で試してから、生成されたバージョンと比較することは教育的かもしれません。

必ずオーバーライドしてくださいhashCode(IDEも同様にこれを支援し、問題についてオンラインでたくさん読んでいます-検索するだけです)。

TreeSet(または他のSortedSet実装)を使用する場合は、要素オブジェクトを実装するComparableか、を指定する必要がありSortedSetますComparator

于 2012-08-09T04:08:15.523 に答える
1

一意の要素を格納するSet代わりにを使用することをお勧めします。ArrayListそれはより簡単できれいです。

javadocSetよると、次のようになります。

重複する要素を含まないコレクション。より正式には、セットには、e1.equals(e2)のような要素e1とe2のペアは含まれず、最大で1つのnull要素が含まれます。その名前が示すように、このインターフェイスは数学的な集合の抽象化をモデル化します

これは、から繰り返される要素を削除する方法について説明しているSOの記事ArrayListです。ただし、提供されているソリューションのほとんどは、の実装を使用して、実行しSetたいことを実現していることに気付くでしょう。いずれにせよ、equals()あなたが行ったようにオーバーライドしても、あなたの目的を達成するのに役立ちません。それがそれほど問題ではない場合(ArrayList実際の要件を考慮して、なぜ固執する必要があるのか​​わかりませんが、実装に移行することを強くSetお勧めします。

于 2012-08-09T04:07:44.847 に答える
0

フルーツネームクラスに2つの属性がある場合fruitnamefruitclass

チェックコードは

UniqueFruits current = (UniqueFruits) in;
if(this.fruitname.equals(current.fruitname) && this.fruitclass.equals(current.fruitclass)) {
  return true;
}else{
   return false;
}

そして、ハッシュコードに来て、IDEにクラスのhasdcodeを生成するように依頼しますUniqueFruits。そしてSet代わりに使用するArrayList

簡単に言えば、IDEはequals()を生成することもできます。

于 2012-08-09T04:09:53.183 に答える