Итак, у меня есть класс, реализующий Iterable для записи набора методов для. Большинство из них довольно просто продумать, однако мне трудно написать метод удаления для класса.Написание метода удаления для класса, реализующего Iterable
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;
}
}
Мои мысли позади метода удаления заключаются в следующем: пройдите через сумку, найдите элемент для удаления, возьмите тот же предмет и переместите его в конец мешка (заменив его место последним предметом в сумке), затем уменьшите размер мешка (думая, что он удалит Это).
Теперь, очевидно, есть некоторые проблемы с моим мышлением. 1) Сумка по-прежнему является ее первоначальным размером. 2) Сумка теперь неупорядочена, что впоследствии вызовет проблему при сравнении двух пакетов.
Итак, мой вопрос: как я могу эффективно написать метод удаления, чтобы вытащить элемент из класса моей сумки, не столкнувшись с проблемами, о которых я упоминал ранее.
Главная
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 ]
}
}
Я добавил метод equals в самом конце моего кода, это то, что я планировал добавить. Я должен добавить, что мне необходимо реализовать эти последние 4 метода (содержит, addUnique, remove, equals) для существующего кода, который был предоставлен мне в моем классе структур данных (поэтому я не могу изменить ничего, что было дано мне). Рад слышать, что моя первая забота не должна быть одна. Я добавлю еще один фрагмент кода, чтобы показать, в чем я столкнулся. Спасибо, что нашли время, чтобы пройти через все это! – 23k
Ваш метод '.equals()' является проблематичным по нескольким причинам. Самое главное, '.equals()' нарушается, если '.hashcode()' также реализуется одинаково (т. Е. Если 'a.equals (b)' then' a.hashcode() 'должен равняться' b.hashcode() '), но и хуже, чем реализация' Object.equals() 'по умолчанию, которая, по крайней мере, вернула бы« true »(правильно), если вы попытаетесь сравнить один и тот же объект (' a.equals (a) ') - ваша реализация вернет 'false', что неверно. – dimo414
Метод '.equals()' все еще находится в моем списке задач, я знаю, что реализация в настоящее время неверна, я попрошу вас игнорировать это на данный момент. Я добавил больше примера кода к основному.В основном, удаление должно быть возвращено false, если элемент больше не находится в сумке, однако вызов дважды удаляется в одном элементе, дает неверные результаты, что вначале заставило меня поверить, что элемент фактически не удаляется, просто скрывается. – 23k