2016-09-21 1 views
-3

Dieses Objekt ist eine Packung Kaugummi. Jedes Kaugummi ist einzigartig. Wir haben eine Packung zusammengestellt, die 12 Zahnfleisch aufnehmen kann. Wir bevölkern die Packung mit neuen Kaugummi-Objekten. Wir müssen die Packung überprüfen, um zu sehen, ob diese Art von Kaugummi bereits in der Packung enthalten ist. Jedes Kaugummi in der Packung muss einzigartig sein.Java verschachtelte Schleifen verhindern doppelte

public PackOfGum() 
{ 
    pack = new Gum[12]; 
    // Successfully populate pack with gum 
    for (int i=0; i<12; i++) { 
    pack[i] = new Gum(); 


    // Failure preventing duplicate gums. Idea is to look in the pack 
    // at all of the gums that came before this one, and see if this one 
    // matches any of them. While yes and it is a duplicate, then choose 
    // a new gum. 
    for (j=0; j<i; j++) { 
     while (pack[i] == pack[j]) { 
     pack[i] = new Gum(); 
     } 
    } 
    } 
} 

Ich bin Fehler korrekt alle bisherigen Zahnfleisch zu überprüfen und sie auf die aktuelle Gummi vergleichen. Wie sollte das richtig gemacht werden?

+2

Ich bin mir nicht sicher, ob ich Ihre Frage richtig verstehe. Aber wenn Sie nur eine nicht doppelte Sammlung von Waffen speichern möchten, können Sie java.util.Set zum Speichern verwenden. Sie müssen die Equals-Methode in der Gum-Klasse implementieren, um die Gleichheitsbedingung zu definieren. –

+0

Eine Frage: Wie vergleichen Sie Gum-Objekte? Verwenden Sie seine Speicheradresse oder seinen Wert? – MaxZoom

+0

Was ist die Definition von "Art" von Kaugummi? Sie vergleichen jetzt, ob zwei Gum-Referenzen auf dieselbe Gum-Objektinstanz verweisen. Da Sie für jedes Element im Array eine neue Gum-Instanz erstellen, wird es immer anders aussehen. –

Antwort

1

Sie müssen Ihre eigene Implementierung von equals() in Ihrem Gum class bereitstellen.

@Override 
public boolean equals(Object other) 
{ 
    if (!(other instanceof GumClass)) 
    { 
     return false; 
    } 
    GumClass that = (GumClass) other; 
    // Custom equality check here. 
    return this.field1.equals(that.field1) 
    && this.field2.equals(that.field2); 
} 

Sie sollten auch hashCode() außer Kraft setzen, wenn eine Chance, Ihre Objekte gibt es in einer Hash-Tabelle verwendet wird. Eine vernünftige Implementierung wäre, um die Hash-Codes der Felder des Objekts verbinden sich mit so etwas wie:

@Override 
public int hashCode() 
{ 
    int hashCode = 1; 
    hashCode = hashCode * 37 + this.field1.hashCode(); 
    hashCode = hashCode * 37 + this.field2.hashCode(); 
    return hashCode; 
} 

this question Siehe für weitere Details über die Implementierung einer Hash-Funktion

+1

@Hector Die Implementierung von 'hashCode' ohne die Implementierung von' equals' bricht den Vertrag nicht. Obwohl es irgendwie albern ist. – ajb

0

Es gibt eine Reihe von Dingen aus Ihrer Frage fehlt. Zum einen, da Sie uns die Gum Klasse nicht gegeben haben, kann ich nicht herausfinden, wie jedes new Gum() eine einzigartige Gum erstellen wird. Hat Gum eine Art von flavor Instanzvariable, die zu einem zufälligen Geschmack initialisiert wird? Vielleicht, aber Sie haben uns diese Information nicht gegeben. Auch, wie die andere Antwort darauf hinweist, wird die Verwendung von ==, um Zahnfleisch zu vergleichen, nicht funktionieren. Unter der Annahme, dass jede Gum eine flavor hat, müssen Sie eine equals() Methode zur Verfügung stellen, die die Felder flavor für Gleichheit vergleicht (und eine hashCode Funktion, die den gleichen Hash-Wert für alle Gum Objekte mit dem gleichen Geschmack zurückgibt).

Das Problem, das ich am meisten hervorheben wollte, war der Fehler in Ihrer Schleifenlogik. Sie gehen durch das Array der vorhandenen Gum Objekte, und wenn Sie ein Duplikat finden, erstellen Sie ein neues Gum. Das wird die Arbeit nicht erledigen. Angenommen, Ihr Array besteht aus den Geschmacksrichtungen A, B, C, D, E. Angenommen, Ihr new Gum() erzeugt ein Kaugummi mit Geschmack C. Sie gehen durch das Array und finden, dass es mit übereinstimmt. So generieren Sie eine weitere Gum --Say Ihre zufällige Gum Generator erzeugt eine Gum mit Geschmack B. Jetzt Ihre Schleife wird es nicht finden, da Sie immer noch durch das Array gehen, und Sie werden nur auf D und E zu sehen. Sie erhalten also ein Duplikat in Ihrem Paket.

Also was machst du? Eine Möglichkeit besteht darin, dass Sie jedes Mal, wenn Sie ein Duplikat finden, ein neues Gum generieren und dann am Anfang des Arrays von vorne beginnen. Das ist ein ziemlich langsamer Weg, Dinge zu tun, aber es wird funktionieren. Einige bessere Optionen:

  • Pflegen Sie eine Set aller Gum ‚s, die bereits in der Packung sind. Jetzt, anstatt durch das Array zu gehen, um zu sehen, ob ein Gum ein Duplikat ist, sehen Sie einfach, ob der Satz es enthält. Wenn Sie HashSet verwenden, können Sie diesen Test in konstanter Zeit durchführen, anstatt ein Array zu durchsuchen. (Wenn Sie eine HashSet verwenden, werden Sie auf jeden Fall benötigen eine funktionierende hashCode Funktion.)

  • Halten Sie ein Array von allen Gum Aromen, die nicht verwendet wurden.Wenn Sie mit 12 Aromen beginnen, wird die erste new Gum() eine Zufallszahl von 0 bis 11, die zweite eine Zufallszahl von 0 bis 10, die dritte von 0 bis 9 usw. verwenden. Jedes Mal verwenden Sie das Array und die Zufallszahl, um den richtigen Geschmack auszuwählen, und führen dann einen Austausch durch, um diesen Geschmack an das Ende des Arrays zu verschieben. Zum Beispiel, wenn das Array beginnt A, B, C, D, E, F, G, H, I, J, K, L und Ihre Zufallszahl ist 4, das ist Geschmack E, und Sie tauschen das mit L zu machen Ihre Anordnung A, B, C, D, L, F, G, H, I, J, K, E. Die nächste Zufallszahl geht nur von 0 bis 11, also wird sie nicht E auswählen. Was immer sie wählt, tauscht man mit K. und so weiter.

Verwandte Themen