2015-09-27 1 views
-3

У меня есть ArrayList<CustomObject> как ArrayList<Names> в моем проекте. Имена POJO содержит имя и изображение поля следующим образом:Как удалить значение дубликатов из ArrayList <CustomObject> в java

Names.java

public class Names { 


    private String name; 

    private String image; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getImage() { 
     return image; 
    } 

    public void setImage(String image) { 
     this.image = image; 
    } 

    public Names(String name, String image) { 
     this.name = name; 
     this.image = image; 
    } 

    @Override 
    public String toString() { 
     // TODO Auto-generated method stub 
     return name; 
    } 

} 

Я добавляю значения поля следующим образом:

  ArrayList<Names> menu = new ArrayList<Names>(); 

     menu.add(new Names("chandru","image1")); 
     menu.add(new Names("vikki","image2")); 
     menu.add(new Names("karthick","image3")); 
     menu.add(new Names("chandru","image4")); 
     menu.add(new Names("karthick","image5")); 
     menu.add(new Names("chandru","image6")); 
     menu.add(new Names("karthick","image7")); 
     menu.add(new Names("vikki","image8")); 
     menu.add(new Names("karthick","image9")); 
     menu.add(new Names("harish","image10")); 
     menu.add(new Names("vivek","image11")); 
     menu.add(new Names("harish","image12")); 

Мое требование:

Теперь все мое требование - удалить повторяющиеся имена, содержащиеся в Arra Мастер стилей. Я попробовал несколько методов, как удалить дубликаты следующим образом:

Метод I: Использование HashSet

Добавление значений в HashSet и назначая назад эти значения в new ArrayList<Names> имени al.

  ArrayList<Names> al = new ArrayList<Names>(); 

      Set<Names> hs = new HashSet<Names>(); 
      hs.addAll(menu); 

      al.clear(); 
      al.addAll(hs); 

      System.out.println(al); 

Выход Метод I:

[karthick, vikki, karthick, karthick, chandru, vivek, vikki, chandru, harish, harish, karthick, chandru] 

Ожидаемый результат будет:

Значения после удаления дубликатов:

[karthick, vikki,chandru, vivek, harish] 

Я также разместить свой цельные CLAS s для вашей справки

import java.util.ArrayList; 
import java.util.HashSet; 
import java.util.Iterator; 
import java.util.LinkedHashSet; 
import java.util.List; 
import java.util.Scanner; 
import java.util.Set; 


public class Sample { 

    public static void main(String[] args) { 

     ArrayList<Names> menu = new ArrayList<Names>(); 
     menu.add(new Names("chandru","image")); 
     menu.add(new Names("vikki","image")); 
     menu.add(new Names("karthick","image")); 
     menu.add(new Names("chandru","image")); 
     menu.add(new Names("karthick","image")); 
     menu.add(new Names("chandru","image")); 
     menu.add(new Names("karthick","image")); 
     menu.add(new Names("vikki","image")); 
     menu.add(new Names("karthick","image")); 
     menu.add(new Names("harish","image")); 
     menu.add(new Names("vivek","image")); 
     menu.add(new Names("harish","image")); 

     ArrayList<Names> al = new ArrayList<Names>(); 

      Set<Names> hs = new HashSet<Names>(); 
      hs.addAll(menu); 

      al.clear(); 
      al.addAll(hs); 

      System.out.println(al); 

    } 
} 

Пожалуйста, помогите мне решить проблему, с которой я столкнулся, чтобы удалить дубликаты из списка. Любые предложения и решения были бы очень полезны для меня. Заранее спасибо.

+4

Вы не переопределяют 'хэш-код()' и 'Equals()' в вашем классе 'Names'. – Eran

+0

Если вы хотите, чтобы HashSet удалял дубликаты на основе 'name'' Names', то два экземпляра 'Names' с одинаковым именем должны быть равны. Но это не так, потому что вы не переопределили 'equals()' и 'hashCode()', чтобы это произошло. –

+0

@JBNizet Я действительно не знаю, как это сделать. Можете ли вы опубликовать какой-то фрагмент кода? – Chandru

ответ

2

Вам просто нужно переопределить хэш-код и равно, и ваш код работает хорошо:

public class Names { 


    private String name; 

    private String image; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getImage() { 
     return image; 
    } 

    public void setImage(String image) { 
     this.image = image; 
    } 

    public Names(String name, String image) { 
     this.name = name; 
     this.image = image; 
    } 

    @Override 
    public String toString() { 
     return name; 
    } 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime * result + ((name == null) ? 0 : name.hashCode()); 
     return result; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     if (this == obj) 
      return true; 
     if (obj == null) 
      return false; 
     if (getClass() != obj.getClass()) 
      return false; 
     Names other = (Names) obj; 
     if (name == null) { 
      if (other.name != null) 
       return false; 
     } else if (!name.equals(other.name)) 
      return false; 
     return true; 
    } 


} 

испытания Класс

import java.util.ArrayList; 
import java.util.HashSet; 
import java.util.Set; 

public class Test { 


    public static void main(String[] args) { 

     ArrayList<Names> menu = new ArrayList<Names>(); 
     menu.add(new Names("chandru","image")); 
     menu.add(new Names("vikki","image")); 
     menu.add(new Names("karthick","image")); 
     menu.add(new Names("chandru","image")); 
     menu.add(new Names("karthick","image")); 
     menu.add(new Names("chandru","image2")); 
     menu.add(new Names("karthick","image")); 
     menu.add(new Names("vikki","image")); 
     menu.add(new Names("karthick","image")); 
     menu.add(new Names("harish","image")); 
     menu.add(new Names("vivek","image")); 
     menu.add(new Names("harish","image")); 

     ArrayList<Names> al = new ArrayList<Names>(); 

     Set<Names> hs = new HashSet<Names>(); 
     hs.addAll(menu); 

     al.clear(); 
     al.addAll(hs); 

     System.out.println(al); 

    } 
} 

Надеется, что это поможет!

+1

Теперь установите изображение второго чандру на «image2». Он все еще делает то, что хочет OP? –

+0

Да, приведенный выше код не работает, если я изменяю второе поле изображения как изображение2. – Chandru

+0

@Nizet: зависит от того, что вы хотите сравнить. Если вам просто нужно проверить, что имя дублируется, просто удалите проверку состояния изображения на равных и хеш-код. –

2

Вам необходимо переопределить equals и hashcode метод для Names класс.

hashcode метод используется для расчета ведро в HashSet и equals используется для идентификации дубликатов и не добавит, если какой-либо найден уже в наборе.

@Override 
public boolean equals(Object o) { 
    if (this == o) return true; 
    if (!(o instanceof Names)) return false; 

    Names names = (Names) o; 

    if (image != null ? !image.equals(names.image) : names.image != null) return false; 
    if (name != null ? !name.equals(names.name) : names.name != null) return false; 

    return true; 
} 

@Override 
public int hashCode() { 
    int result = name != null ? name.hashCode() : 0; 
    result = 31 * result + (image != null ? image.hashCode() : 0); 
    return result; 
} 
0

Почему не следует использовать набор для всего, вместо использования ArrayList. Для правильной работы Set вам придется перезаписать методы equals (E object) и hashcode() в вашем Names.class соответственно.Пожалуйста, смотрите Java Generics Дополнительные советы:

Java Overriding equals and hashCode with Generics

Смежные вопросы