2013-05-24 2 views
1

У меня есть ArrayList, созданный из объектов классов. Класс имеет несколько строковых полей. В некоторых классах некоторые поля, которые являются одинаковыми, должны быть удалены из ArrayList.Сравнение ArrayList

Поле из класса, которое мне нужно проверить, отсортировано_частники, которые в некоторых объектах одинаковы.

Это мой класс:

public class Neo4jCompensation { 
    private String number_of_participants; 
    private String amount; 
    private String sorted_participants; 
    private String unsorted_participants; 
    private String href_pdf_compensation; 
    private String signed_by_all; 

    public Neo4jCompensation() { 
     this.number_of_participants = ""; 
     this.amount = ""; 
     this.sorted_participants = ""; 
     this.unsorted_participants = ""; 
     this.href_pdf_compensation = ""; 
     this.signed_by_all = ""; 
    } 



    public String getNumber_of_participants() { 
     return number_of_participants; 
    } 

    public void setNumber_of_participants(String number_of_participants) { 
     this.number_of_participants = number_of_participants; 
    } 

    public String getAmount() { 
     return amount; 
    } 

    public void setAmount(String amount) { 
     this.amount = amount; 
    } 

    public String getSorted_participants() { 
     return sorted_participants; 
    } 

    public void setSorted_participants(String sorted_participants) { 
     this.sorted_participants = sorted_participants; 
    } 

    public String getUnsorted_participants() { 
     return unsorted_participants; 
    } 

    public void setUnsorted_participants(String unsorted_participants) { 
     this.unsorted_participants = unsorted_participants; 
    } 

    public String getHref_pdf_compensation() { 
     return href_pdf_compensation; 
    } 

    public void setHref_pdf_compensation(String href_pdf_compensation) { 
     this.href_pdf_compensation = href_pdf_compensation; 
    } 

    public String getSigned_by_all() { 
     return signed_by_all; 
    } 

    public void setSigned_by_all(String signed_by_all) { 
     this.signed_by_all = signed_by_all; 
    } 


} 

Так я первый список заполнен с классами:

ArrayList<Neo4jCompensation> results_list=new ArrayList<Neo4jCompensation>(); 

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

ArrayList<Neo4jCompensation> results_list1=new ArrayList<Neo4jCompensation>(); 

for(Neo4jCompensation pp:results_list) 
{ 

Neo4jCompensation ss=new Neo4jCompensation(); 
ss.setAmount(pp.getAmount()); 
ss.setHref_pdf_compensation(pp.getHref_pdf_compensation()); 
ss.setNumber_of_participants(pp.getNumber_of_participants()); 
ss.setSigned_by_all(pp.getSigned_by_all()); 
ss.setSorted_participants(pp.getSorted_participants()); 
ss.setUnsorted_participants(pp.getUnsorted_participants()); 
results_list1.add(ss); 
} 

for (int i = 0; i < results_list.size(); i++) { 
       Neo4jCompensation kk=new Neo4jCompensation(); 
        kk=results_list.get(i); 

       for (int j = 0; j < results_list1.size(); j++) { 
        Neo4jCompensation n2=new Neo4jCompensation(); 
        n2=results_list1.get(j); 
        if(i!=j) 
        { 
         String prvi=kk.getSorted_participants().trim(); 
         String drugi=n2.getSorted_participants().trim(); 
        if(prvi.equals(drugi)) 
        { 

         // results_list1.remove(j); 
        out.println("<p> Are equal su :"+i+" i "+j+"</p>"); 
        } 
        } 

       } 

      } 

Так как я знаю, что я не могу цикл и удалить элементы из ArrayList в то же время я пытался использовать итераторы, как это ...

int one=0; 
int two=0; 

Iterator<Neo4jCompensation> it = results_list.iterator(); 
while (it.hasNext()) { 
    Neo4jCompensation kk=it.next(); 

    Iterator<Neo4jCompensation> it1 = results_list1.iterator(); 
    while (it1.hasNext()) { 

    Neo4jCompensation kk1=it1.next(); 
    String oo=kk.getSorted_participants().trim(); 
    String pp=kk1.getSorted_participants().trim(); 
    if(one<two && oo.equals(pp)) 
    { 
    it1.remove(); 
    } 
    two++; 
    } 
    one++; 
} 

Но он терпит неудачу и возвращает мне ничего в ArrayList results_list1 - перед удалением с помощью итератора он имеет в себе правильные элементы. Как удалить объекты из списка массивов, которые имеют те же значения полей, что и некоторые другие объекты в ArrayList.

ответ

0

Почему бы не использовать .removeAll()

results_list1.removeAll(resultList); 

Это потребует от вас реализовать equals и hashcode в Neo4jCompensation

public class Neo4jCompensation { 

     //Omitted Code 

    @Override 
    public int hashCode() { 
     final int prime = 31; 
     int result = 1; 
     result = prime 
       * result 
       + ((number_of_participants == null) ? 0 
         : number_of_participants.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; 
     Neo4jCompensation other = (Neo4jCompensation) obj; 
     if (number_of_participants == null) { 
      if (other.number_of_participants != null) 
       return false; 
     } else if (!number_of_participants.equals(other.number_of_participants)) 
      return false; 
     return true; 
    } 


} 
0

Другой подход может быть:

Overrride составляет метод в Neo4jCompensation и проверки для отсортированных_частников и соответственно возвращаться. Затем используйте Set как коллекцию ваших объектов. Набор не позволяет дублировать и использует равные для определения равенства.

0
for (int i = 0; i < results_list.size(); i++) { 
    Neo4jCompensation kk=new Neo4jCompensation(); 
    kk=results_list.get(i); 
    for (int j = 0; j < results_list1.size(); j++) { 
     Neo4jCompensation n2=new Neo4jCompensation(); 
     n2=results_list1.get(j); 
     if(results_list1.contains(kk) { results_list1.remove(j); } 
} 

Но вы можете использовать Set вместо List или структуру данных, которая поддерживает порядок, как SortedMap со значением дозорного.

+0

Это не весь класс, который является дубликатом, а членом класса класса sorted_participants, другие поля могут быть разными. –

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