2016-12-13 3 views
-2

10個のオブジェクトを保持するハッシュセットを持っていますが、そのうちの1つを削除するにはどうすればいいですか?これは、コードで、今私は「ピザのスライス」1を削除する方法を作成する必要がありJavaのハッシュセットからオブジェクトを削除します

private HashSet<Slice> pizza; 

public Pizza(int slicesofPizza) { 
    pizza = new HashSet<Slice>(); 

    for (int i = 0; i < slicesofPizza; i++) {   
     Slice slice = new Slice(); 
     pizza.add(slice); 
    } 
} 

編集:私は何を求めています、私はメソッドを持っている場合、どのように私は単数形のスライスを削除するか、これはあるでしょうです不可能:

公共スライスremoveSlice(){

} 
+3

救助へのJavadoc! https://docs.oracle.com/javase/8/docs/api/java/util/HashSet.html – NPE

+0

'Slice'オブジェクトと' hashcode() 'および' equals() 'の実装をどのように識別しているかによって異なります。 '。ところで、あなたのコードはコンパイルされません: 'ペニー'とは何ですか? –

答えて

0
pizza.remove(slice) 

HashSetのから一つの "スライス" を削除します。

+3

これは、 'Slice'クラスの構築方法によっては保証されません。 'add()'の直後に追加しない限り、それは正しくありません。 – Kayaman

+0

いいえこれは1つの 'slice'を削除しません。その特定の' slice'オブジェクトをHashSetから削除します。 https://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html#remove(java.lang.Object) –

0

Sliceに等しいSliceを作成する方法がなく、他のデータ構造にスライスを保存しない場合は、HashSetを使用することはあまり意味がありません。

コンストラクタには、Sliceを他と区別するためのパラメータがありません。つまり、すべてのスライスが等しいか、すべてのスライスがペアごとに異なることを意味します。これは、セットに最大で1スライス(この場合はclear()を使用)が含まれているか、またはSetを反復せずにスライスを再度見つけることができないことを意味します。

HashSetは、この場合はむしろむしろ非効率的です。Collection

それは使用して行うことができるしかしIterator:ちょうど任意のいずれかになりIteratorによって返された最初のスライスを、削除します

Iterator<Slice> iterator = pizza.iterator(); 
if (iterator.hasNext()) { 
    iterator.next(); 
    iterator.remove(); 
} 

+0

ifteratorループを削除した後、一致するのは1つだけです。それ以外の場合は、別のセットに入れて、イテレーションが完了した後にremoveAll()を使用する方が良い(または必要です)。私は同時に、同時の変更がスローされることを思い出します。 – Vadim

+0

@ Vadimこれは、ループをループしてセット内を繰り返すことは想定されていません。 IMHOは、追加したスライスを削除することについて質問しています。ループを使用していなくても、私は同じループを使用しません。同じイテレータを使用すると、ConcurrentModificationExceptionが発生しません。 – fabian

+0

同じスライスであるかどうかにかかわらず、次の要素を1つだけ削除しています。私はそれが実際の目標だとは思わない。しかし、何でも...特定のスライスを削除するには、「削除する」いくつかの基準にスライスの等価性を定義する必要があります。 – Vadim

0

まずequals(Object o)メソッドをSliceクラスでオーバーライドする必要があります。これはHashSetからSliceオブジェクトを削除する際に役立ちます。

HashSetから要素を削除している間に、渡されたオブジェクトとすでに存在するオブジェクトを比較する必要があります。 equals(Object o)メソッドを書き留めておけば、どのような条件で2つのSliceオブジェクトが等しいと考えているのでしょうか。

これ以降はです。

0

Setインターフェイスには、ジョブを実行するremoveメソッドがあります。スライスは、setメソッドの動作に影響する可能性があるため、ハッシュコードを正しく実装していることを確認してください。

+0

問題は、ユーザーが明らかに「削除」する特定のスライスを持っていないことです。 –

0
  1. SliceクラスとPennyクラスを拡張するすべてのクラスでequalsメソッドをオーバーライドする必要があります。 pizza.removeメソッドを動作させる必要があります。 例1スライスは、そのタイプ、サイズ、および価格が互いに等しい場合、別のスライスとなります。 (または任意の他の属性)
  2. その後、同じタイプ、サイズと価格とのスライスがある場合、それはセットからのスライスを削除します

    Slice sliceToRemove = new Slice(type,size,price); 
    pizza.remove(sliceToRemove); 
    

を使用することができます。

とにかく、セット内のスライスを識別する属性が必要です。

equalsをオーバーライドしないと、Setを反復処理し、それらの属性をチェックして一致するかどうかを調べる必要があります。

関連する問題