Also habe ich eine Klasse, die Iterable implementiert, um eine Reihe von Methoden zu schreiben. Die meisten von ihnen sind ziemlich einfach zu durchdenken, aber ich habe Probleme beim Schreiben einer Remove-Methode für die Klasse.Eine Remove-Methode für eine Klasse schreiben, die Iterable implementiert
import java.util.Iterator;
public class Bag<Item> implements Iterable<Item> {
private Item[] data = (Item[]) new Object[5];
// The size variable keeps track of how many items
private int size = 0;
public String toString() {
StringBuilder b = new StringBuilder("[");
for (Item i : this)
b.append(i + " ");
return b.toString() + "]";
}
public void expandArray() {
int capacity = data.length * 2;
Item[] newData = (Item[]) new Object[capacity];
for (int i = 0; i < data.length; i++)
newData[i] = data[i];
data = newData;
}
public boolean add(Item x) {
if (size == data.length)
expandArray();
data[size++] = x;
return true;
}
// return an Iterator for the bag
public Iterator<Item> iterator() {
return new BagIterator<Item>();
}
// Iterator class
public class BagIterator<Item> implements Iterator<Item> {
private int i = 0;
public boolean hasNext() {
return i < size;
}
public Item next() {
return (Item) data[i++];
}
}
public boolean contains(Item x) {
for (int i = 0; i < data.length; i++) {
if (data[i] == x)
return true;
}
return false;
}
public boolean addUnique(Item x) {
for (int i = 0; i < data.length; i++) {
if (data[i] == x)
return false;
}
this.size++;
this.add(x);
return true;
}
public boolean remove(Item x) {
Item lastItem = x; // holds x item
Item swap; // holds item to swap
int swapIndex; // holds index of item to swap
for (int i = 0; i < data.length; i++) {
if (data[i] == x) {
// Save the last item
lastItem = data[3];
// Save the swapped item
swap = data[i];
// Save the index of swapped item
swapIndex = i;
// move swap item to end of list
data[3] = swap;
// move last item to swap pos
data[swapIndex] = lastItem;
// remove last item in list
this.size--;
return true;
}
}
return false;
}
public boolean equals(Object o) {
Bag<Item> b = (Bag<Item>) o;
return false;
}
}
Meine Gedanken hinter der Methode entfernen sind wie folgt; Gehe durch die Tasche, finde den zu entfernenden Gegenstand, nimm den gleichen Gegenstand und bewege ihn zum Ende der Tasche (tausche seinen Platz mit dem letzten Gegenstand in der Tasche) und verkleinere dann die Größe der Tasche (denkend, dass sie sich entfernen würde) es).
Nun klar es gibt einige Probleme mit meinem Denken. 1) Die Tasche hat immer noch ihre Originalgröße. 2) Der Beutel ist jetzt ungeordnet, was später beim Vergleich zweier Beutel zu einem Problem führen wird.
Also meine Frage ist, wie kann ich effektiv eine remove-Methode schreiben, um einen Artikel aus meiner Tasche Klasse ohne in die Probleme, die ich bereits erwähnt, zu nehmen.
Haupt
public class Main {
public static void main (String[] args) {
Bag<Integer> bag = new Bag<>();
bag.add(1);
bag.add(2);
bag.add(3);
bag.add(4);
System.out.println(bag); // [1, 2, 3, 4]
System.out.println(bag.remove(4)); // should remove 4 and return true **WORKING
System.out.println(bag.remove(1)); // should remove 1 and return true **WORKING
System.out.println(bag.remove(1)); // should NOT remove 1 and return false **NOT WORKING
System.out.println(bag); // [4 ]
}
}
Ich habe am unteren Rand meines Codes eine equals-Methode hinzugefügt, etwas, das ich hinzufügen wollte. Ich sollte hinzufügen, dass ich diese letzten 4 Methoden (contains, addUnique, remove, equals) zu dem existierenden Code implementieren muss, der mir in meiner Datenstrukturen-Klasse gegeben wurde (so kann ich nichts ändern, was mir gegeben wurde). Ich bin froh zu hören, dass meine erste Sorge nicht eine sein sollte. Ich werde mehr Code-Schnipsel hinzufügen, um genau zu zeigen, worauf ich hinauswill. Danke, dass du dir die Zeit genommen hast, all das durchzugehen! – 23k
Ihre '.equals()' Methode ist aus verschiedenen Gründen problematisch. Am wichtigsten ist, dass '.equals()' gebrochen wird, es sei denn, '.hashcode()' wird ebenfalls auf dieselbe Weise implementiert (dh wenn 'a.equals (b)' dann 'a.hashcode()' gleich 'b.hashcode sein muss() '), aber es ist auch schlechter als die standardmäßige' Object.equals() 'Implementierung, die mindestens' true' (korrekt) zurückgibt, wenn Sie versuchen, dasselbe Objekt zu vergleichen ('a.equals (a)')) - Ihre Implementierung würde "false" zurückgeben, was inkorrekt ist. – dimo414
Die Methode '.equals()' befindet sich immer noch auf meiner Todo-Liste. Ich bin mir bewusst, dass die Implementierung derzeit nicht korrekt ist. Ich werde Sie bitten, dies vorerst zu ignorieren. Ich habe dem Hauptprogramm ein Codebeispiel hinzugefügt.Grundsätzlich sollte entfernen falsch zurückgegeben werden, wenn das Element nicht mehr in der Tasche ist, jedoch zweimal aufrufen auf demselben Element falsche Ergebnisse liefert, was ursprünglich zu der Annahme führen, dass das Element nicht wirklich entfernt wird, nur versteckt. – 23k