2013-04-09 11 views
0

У меня есть модель данных, как это:Элемент не удаляется из вектора после преобразования из JSON в вектор

public class Person { 
     String name = ""; 
     Integer id; 
     public Person() { 
      name = ""; 
      id = new Integer(0); 
     } 
    } 

Сначала я создал 2 объекта и добавляемый в векторе. Преобразовал вектор в строку json. После повторной проверки я превратил строку json в вектор. Внутри вектора отображается правильное количество элементов и данных. Но когда я пытаюсь получить позицию одного объекта, он возвращает -1. Даже с помощью vector.remove() Я не могу удалить объект. Если я не конвертирую вектор в строку json, он работает нормально. Ниже мой код:

 Gson gson = new Gson(); 
     Vector vecResult = new Vector(); 

     Person person = new Person(); 
     person.name = "ABC"; 
     person.id = new Integer(1001); 

     vecResult.add(person); 

     Person person2 = new Person(); 
     person2.name = "DEF"; 
     person2.id = new Integer(1002); 

     vecResult.add(person2); 

     String json = gson.toJson(vecResult); //successful 

     Type token = new TypeToken<Vector<Person>>() {}.getType(); 
     Vector<Person> vecResults = gson.fromJson(json3, token); //vecResults got 2 objects 
     int pos = vecResults.indexOf(person); //returning -1 
     boolean isRemoved = vecResults.remove(person); // returning false 

ответ

1

Вам необходимо переопределить следующие

boolean equals(Object obj) 
int  hashCode() 

Ваш код не работает, потому что Vector#remove использует следующие для получения индекса.

public synchronized int indexOf(Object o, int index) { 
    if (o == null) { 
     for (int i = index ; i < elementCount ; i++) 
     if (elementData[i]==null) 
      return i; 
    } else { 
     for (int i = index ; i < elementCount ; i++) 
     if (o.equals(elementData[i])) 
      return i; 
    } 
    return -1; 
    } 

Пожалуйста, обратите внимание, реализация по умолчанию равняется следующим

public boolean equals(Object obj) { 
    return (this == obj); 
    } 
1

Ваш Person класс не переопределяет equals() (или hashCode()).

При сериализации в JSON, а затем десериализации, которые будут создавать новые экземпляры Person - которые совершенно неравные к оригинальным, насколько indexOf и remove обеспокоены. Они имеют одинаковые значения name и id, но это не делает их автоматически равными.

Переопределение Object.equals() и Object.hashCode() для любого значения равенства, которое вы хотите (просто имя? Просто ID? Both?), И все должно быть хорошо.

Обратите внимание, что обычно лучше делать поля частными и предоставлять свойства getters/seters.

0

remove() пытается разрушить объект с помощью метода equals(). По умолчанию это идентификатор объекта. Создайте явный метод equals() для человека (в eclipse вы можете просто сгенерировать его, используя все поля). (При переопределении equals() вам также необходимо иметь соответствующий метод hashcode())