2009-02-26 3 views
0

У меня есть MyClass, в котором хранятся два целых числа, и у меня есть Vector<MyClass>, называемый myVector.Java: Удаление пользовательского объекта из вектора

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

... 
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()); 
... 

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

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

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

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

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

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

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

+0

Я взял на себя ответственность за использование MyClass, так как классы должны начинаться с буквы верхнего регистра по соглашению. –

+0

ОК, извините, что я не хорош с именами. – 2009-02-26 00:15:16

+0

Прочитайте PDF, с которым я связан, для получения информации о hashCode(). –

ответ

0

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

@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.

1

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

Если вы хотите, чтобы считать равными, что вам нужно переопределить метод Equals для MyClass в убедитесь, что значения равны.

+0

и, конечно же, метод hashcode. Для этого Eclipse имеет приличный автогенератор. – JeeBee

0

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

Chapter 3 of Effective Java расскажет больше.

2

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

  • реализации 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()); 

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

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