Java: удаление пользовательского объекта из вектора - PullRequest
0 голосов
/ 26 февраля 2009

У меня есть MyClass, в котором хранятся два целых числа, и у меня есть Vector<MyClass> с именем myVector.

Теперь я делаю это:

...
myVector.add(new MyClass(1,1));
for(MyClass m : myVector)
    System.out.println(m);
System.out.println(myVector.size());

myVector.remove(new MyClass(1,1));
for(MyClass m : myVector)
    System.out.println(m);
System.out.println(myVector.size());
...

Проблема здесь в том, что объект не удаляется, как я вижу, когда печатаю Вектор и его размер. Как я могу это исправить?

Редактировать: Я вижу, что он не находит объект, и я проверил с contains(), чтобы убедиться. Что мне нужно, это сравнить его по значению. Если бы я мог перегрузить оператор ==, я мог бы это сделать, но я понятия не имею, как это исправить.

Редактировать 2: Хорошо, equals() сделает то, что я хочу. Но я не уверен, что поместить в метод hashCode.

Редактировать 3: Я могу найти его с помощью функции Вектор (), но удаление не удаляет его.

Я могу использовать это, чтобы удалить его, хотя:

int position = myVector.indexOf(new MyClass(1,1));
myVector.remove(position);

Что аналогично удалению (новый MyClass (1,1), за исключением того, что приведенный выше код работает, а удаление () - нет.

Ответы [ 4 ]

2 голосов
/ 26 февраля 2009

У вас есть два варианта:

  • реализовать equals() для MyClass или
  • удалить тот же экземпляр объекта, который вы добавили

Ваш код был изменен для удаления того же экземпляра, который вы добавили:

MyClass myClass = new myClass(1,1);
myVector.add(myClass );
for(myClass m : myVector)
  System.out.println(m);
System.out.println(myVector.size());

myVector.remove(myClass );
for(myClass m : myVector)
  System.out.println(m);
System.out.println(myVector.size());

Я вижу, что другие дали пример реализации для equals() - но вы должны решить, хотите ли вы этого? Это очень хорошо может быть. Вы можете выбрать, какой из двух вариантов выше подходит для этого объекта.

Как говорили другие, если вы реализуете equals(), тогда вы должны внедрять hashCode(). В Eclipse есть хорошая опция для щелчка правой кнопкой мыши для реализации equals() и hashCode(). Я видел проблемы с кодом, когда кто-то реализовывал только equals(), поэтому, хотя это кажется теоретической проблемой, на самом деле это не так.

1 голос
/ 26 февраля 2009

Вы пытаетесь удалить другой myClass, даже если он содержит те же значения, что и первый.

Если вы хотите, чтобы они считались равными, вам необходимо переопределить метод equals для myClass, чтобы проверить, что значения равны.

0 голосов
/ 26 февраля 2009

В ответе grammar31 есть несколько ошибок; исправьте их здесь:

@Override
public boolean equals(Object o) {
  if ((o == null) || (o.getClass() != myClass.class)) {
    return false;
  }
  myClass other = (myClass) o;
  return (other.a == this.a) && (other.b == this.b);
}

@Override
public int hashCode() {
  return a * 31 + b;
}

Это предполагает, что myClass имеет int членов a и b.

0 голосов
/ 26 февраля 2009

Вам нужно реализовать .equals(), чтобы эти два объекта были рассмотрены ... ну, равны. Но имейте в виду, что контракт на .equals() и .hashCode() в основном говорит вам, что вы должны реализовать .hashCode() всякий раз, когда вы реализуете .equals().

Глава 3 Эффективной Java расскажет вам больше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...