2016-03-21 2 views
0

У меня есть два объекта с тем же именем, но они содержат разные возрасты (значения). Я попытался добавить эти объекты к карте, чтобы удалить дубликаты, но не удаляется. Это модель кода я тестирование:Удаление повторяющихся объектов, которые содержат разные переменные

two ab = new two("john", "20"); 
two ac = new two("chan", "30"); 
two ad = new two("john", "34"); 

ArrayList<two> ae = new ArrayList<>(); 

public void adding(){ 
ae.add(ab); 
ae.add(ac); 
ae.add(ad); 
System.out.println(ae); 
} 

public void removeDuplicate(){ 
    Set<two> lhs = new HashSet<>(); 
    lhs.addAll(ae); 
    ae.clear(); 
    ae.addAll(lhs); 
    System.out.println(ae); 
} 

public static void main(String args[]){ 

    one five = new one(); 

    five.adding(); 
    five.removeDuplicate(); 
} 

Это класс, который используется для типа объекта:

package teeestserrr; 

public class two { 

private String name; 
private String age; 

public two(String name, String age){ 
    this.age = age; 
    this.name = name; 
} 

public String getName(){ 
    return name; 
} 

public String getAge(){ 
    return age; 
} 

public String toString(){ 
    return name + " " + age; 
} 
} 

Результаты:

[john, chan, john] 
[chan, john, john] 

Я также попытался сделать toString возвращает только имя, но карта, используемая для удаления дубликатов, не работает даже в этом случае. Я не понимаю, и я не могу определить основную проблему. Любая помощь приветствуется.

+0

Вы должны переопределить 'equals' и' hashCode' в классе 'two' – Eran

+0

Eran верен. HashSet полагается на эти два метода для его работы (отсюда и название HashSet). Используйте свою любимую поисковую систему, чтобы найти руководство о том, как эти два метода должны быть реализованы. Возможно, даже ваша IDE может сгенерировать их для вас. –

ответ

0

Вы должны переопределить equals и hashcode метод в two. Равенство должно давать результат только в соответствии с полем name, а также hashcode должно быть сформировано с использованием только поля name, что поможет вам достичь вашей цели.

package teeestserrr; 

public class two { 

    private String name; 
    private String age; 

    public two(String name, String age){ 
     this.age = age; 
     this.name = name; 
    } 

    public String getName(){ 
     return name; 
    } 

    public String getAge(){ 
     return age; 
    } 


    public String toString(){ 
     return name + " " + age; 
    } 

    @Override 
    public boolean equals(Object obj){ 
     if(obj==null) 
      return false; 
     if(name==null){ 
      return false; 
     } 
     if(!(obj instanceof two)){ 
      return false; 
     } 
     two another = (two)obj; 
     return this.name.equals(another.name); 
    } 

    public int hashCode(){ 
     return name==null?0:name.hashCode(); 
    } 
} 
+0

Почему я могу сделать тот же метод, если я изменил тип объекта на String вместо типа объекта два? – QQQ

+0

Ваш код 'Set lhs = new HashSet <>();', использует hashset, который работает на механизм хеширования. И у вас есть свой пользовательский объект, переданный здесь, поэтому вам нужно переопределить 'equals' и' hashcode' для вашего пользовательского класса. –

+0

@ Vittal Kavitake есть другой способ удалить дубликаты? Я не знаю, как переопределить равные и хэш-коды :(Можете ли вы показать мне пример? – QQQ