2016-12-13 10 views
-2

Ich habe ein Hashset, das 10 Objekte enthält, wie kann ich eines davon entfernen? Dies ist der Code und jetzt brauche ich ein Verfahren zu schaffen, die ein „Stück Pizza“ entferntEntfernen Sie ein Objekt aus einem Hashset in 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); 
    } 
} 

edit: Was ich frage ist, wenn ich eine Methode, wie würde ich eine einzigartige Scheibe entfernen oder ist die nicht möglich:

public Scheibe removeSlice() {

} 
+3

Javadoc zur Rettung! https://docs.oracle.com/javase/8/docs/api/java/util/HashSet.html – NPE

+0

Es hängt davon ab, wie Sie _ ein 'Slice'-Objekt und die Implementierung von' hashcode() '&' equals() _identifizieren '. Übrigens kompiliert dein Code nicht: Was ist ein 'Penny'? –

Antwort

0
pizza.remove(slice) 

wird eine "Scheibe" aus der Hashset entfernen.

+3

Es gibt keine Garantie dafür, je nachdem, wie die Klasse 'Slice' aufgebaut ist. Es sei denn, Sie fügen das direkt nach 'add()' hinzu, aber das ist einfach nicht richtig. – Kayaman

+0

Nein. Dies würde nicht eine "Scheibe" entfernen, sondern würde das spezifische "Scheiben" -Objekt aus dem HashSet entfernen. https://docs.oracle.com/javase/7/docs/api/java/util/HashSet.html#remove(java.lang.Object) –

0

Mit HashSet nicht so viel Sinn machen, wenn Sie keine Möglichkeit haben, eine Slice zu schaffen, die zu einem anderen Slice gleich ist und nicht speichern Sie die Scheiben in einem anderen Datenstruktur.

In Ihrem Fall gibt es keinen Parameter im Konstruktor, der dazu beitragen könnte, einen anderen Slice zu unterscheiden, was bedeutet, dass entweder alle Schichten gleich oder alle Schichten paarweise verschieden sind. Dies bedeutet entweder, dass die Menge höchstens eine Schicht enthält (verwenden Sie in diesem Fall clear()) oder Sie können eine Schicht nicht erneut finden, ohne die Set zu durchlaufen.

Dies macht HashSet nur eine ineffiziente Collection in diesem Fall.

aber es getan werden könnte, mit einem Iterator:

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

, die der ersten Scheibe einfach entfernen werden von den Iterator zurückgegeben, das willkürlich sein könnte.

+0

Ich nehme an, dass es besser ist, Iterator-Schleife nach dem Entfernen von If zu brechen nur ein Spiel kann da sein. Andernfalls ist es besser (oder erforderlich), sie in einen anderen Satz zu setzen und removeAll() nach den durchgeführten Iterationen zu verwenden. Wie ich mich erinnere, wird die gleichzeitige Änderung sonst geworfen. – Vadim

+0

@Vadim es sollte nicht in irgendeine Schleife gehen, die über das Set iteriert. Die Frage, die IMHO zum Entfernen eines Slice nach dem Hinzufügen stellt, ist vollständig und ich verwende auch keine Schleife und selbst wenn ich es täte: Die Verwendung desselben Iterators sollte die 'ConcurrentModificationException' verhindern. – fabian

+0

Sie entfernen nur ein nächstes Element, unabhängig davon, ob es dasselbe Slice ist oder nicht. Ich glaube nicht, dass das ein tatsächliches Ziel ist. Aber was auch immer ... Um einen bestimmten Schnitt zu entfernen muss die Definition der Schnittgleichheit zu den Kriterien "entfernt" werden. – Vadim

0

allererst Sie equals(Object o) Methode in Slice Klasse außer Kraft zu setzen haben, die während helfen, ein Slice Objekt aus dem HashSet entfernen.

Beim Entfernen eines Elements aus HashSet muss das übergebene Objekt mit den bereits vorhandenen Objekten verglichen werden. Sie müssen equals(Object o) Methode schreiben, die, zu welchen Bedingungen Sie zwei Slice Objekt betrachten, um gleich zu sein.

Danach verwenden Sie diese pizza.remove(customSlice).

0

Die Schnittstelle verfügt über eine Remove-Methode, die die Aufgabe erledigt. Stellen Sie sicher, dass Slice Hashcode implementiert und auch gleich ist, da dies das Verhalten der set-Methoden beeinflussen kann.

+0

Problem ist, dass der Benutzer anscheinend keine bestimmte Scheibe zum "Entfernen" hat. –

0
  1. Sie müssen die Methode equals in Ihrer Klasse Slice und in allen Klassen überschreiben, die die Penny-Klasse erweitert. Es wird benötigt, um die pizza.remove-Methode zu aktivieren. als Beispiel ein Slice gleich einem anderen, wenn ihre Typen, Größen und Preise einander entsprechen. (Oder andere Attribute)
  2. Dann können Sie

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

verwenden wird es Scheibe von Set entfernen, wenn eine Scheibe mit der gleichen Art ist, Größe und Preis.

Wie auch immer, Sie müssen Attribute haben, die eine Scheibe im Set identifizieren.

Ohne überschreiben gleich ist, müssen Sie durchlaufen das Set, überprüfen Sie diese Attribute und dann entfernen, wenn sie übereinstimmen.

Verwandte Themen