2012-03-07 4 views
1

Привет, при разработке одного из моих веб-приложений. Я сохраняю информацию пользователя в ArrayList на основе выполненного SQL-запроса, он содержит повторяющиеся объекты, как удалять повторяющиеся объекты в списке, я уже пробовал какой-то метод, но он все еще не работает. Это мой код Поправьте меня, где я ошибаюсьудаление дубликатов записей в списке

 public ArrayList loadData() throws ClassNotFoundException, SQLException { 
    ArrayList userList = new ArrayList(); 
    String url = ""; 
    String dbName = ""; 
    String userName = ""; 
    String password = ""; 
    Connection con = null; 
    Class.forName("org.apache.derby.jdbc.ClientDriver"); 
    con = DriverManager.getConnection(url + dbName, userName, password); 
    PreparedStatement ps = null; 
    try { 
     String name; 
     String fatherName; 
     int Id; 
     String filePath; 
     int age; 
     String address; 
     String query = "SELECT NAME,FATHERNAME,AGE,ADDRESS,ID,FILEPATH FROM USER_INFORMATION ,USER_PHOTO WHERE ID=USER_ID"; 
     ps = con.prepareStatement(query); 
     ResultSet rs = ps.executeQuery(); 
     while (rs.next()) { 
      name = rs.getString(1); 
      fatherName = rs.getString(2); 
      age = rs.getInt(3); 
      address = rs.getString(4); 
      Id = rs.getInt(5); 
      filePath=rs.getString(6); 
      /* if(flag) 
      { 
       prev=Id; 
       flag=false; 
      } 
      else if(Id==prev) 
      { 
       TEMP=TEMP+";"+filePath; 
      }*/ 
      //PhotoList = PhotoList(Id, con); 
      UserData list = new UserData(); 
      list.setName(name); 
      list.setFatherName(fatherName); 
      list.setAge(age); 
      list.setAddress(address); 
      list.setId(Id); 
    //  list.setFilePath(filePath); 
      userList.add(list); 
     } 
     ps.close(); 
     con.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    ArrayList al = new ArrayList(); 
    HashSet hs = new HashSet(); 
    hs.addAll(userList); 
    al.clear(); 
    al.addAll(hs); 
    return al; 
} 

И мой Bean Contant Класс

public class UserData { 

private String name; 
private String fatherName; 
private int Id; 
//private String filePath; 
private int age; 
private String address; 
public UserData() 
{ 

} 

public UserData(String name, String fatherName,int Id, int age,String address) 
{ 
    this.name = name; 
    this.fatherName = fatherName; 
    this.Id = Id; 
    //this.filePath=filePath; 
    this.age=age; 
    this.address=address; 
} 
//GETTER AND SETTER.. 

ответ

1

Если вам нужна коллекция объектов, которые не имеют определенного порядка, и вы не хотите дубликатов, вам лучше всего использовать набор, например, например, HashSet, или, если в вашем наборе порядок важен , TreeSet.

Не забудьте переопределить методы хэша и равенства.

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

public int hashCode() { 
    return (name + fatherName+ Id + filePath + age + address).hashCode(); 
} 

public boolean equals(Object obj) { 
    return (hashCode() == obj.hashCode()); 
} 
+0

Извините, что добавляет список в набор, пытаясь дедуплировать, но это не работает. – Jim

+0

Уверен, что он не работает, он не реализовал хэш и равен ... – hurtledown

+0

Спасибо Джим. После того, как вы включили его в bean-компонент, как его вызвать, он будет неявно вызван или нужно вызвать явно. @ Jim – user1184777

0

Все дубликаты должны быть удалены на уровне SQL. Ваш SQL предполагает, что он может генерировать повторяющиеся записи.

String query = "SELECT NAME,FATHERNAME,AGE,ADDRESS,ID,FILEPATH FROM USER_INFORMATION ,USER_PHOTO WHERE ID=USER_ID"; 

Что означает пункт ID = USER_ID? Разве вы не должны передавать это значение в качестве ввода вашего запроса?

Также является ли столбец ID основным ключом? В противном случае используйте предложение where, которое не создает дубликаты.

0

В вашем классе userdata не используются значения equals или hashcode. Это означает, что два экземпляра, созданные с одинаковыми значениями, не будут считаться дубликатами. Вот почему набор содержит дубликаты.

Например

UserData u1 = new UserData("Foo", "bar",1, 1,"baz"); 

UserData u2 = new UserData("Foo", "bar",1, 1,"baz"); 

u1 и u2 не считаются равными, поскольку они являются разными объектами. Добавление метода equals и hashcode должно исправить это. Однако еще лучше - идея adarshr об удалении обманов в SQL.

+0

Guys Главное, я должен получить полную информацию о пользователях и отображать их информацию, как имя возраст адрес .. и т.д., а также их имя загруженного фото с использованием тега display в struts, так как u уже знает, что каждый пользователь имеет более двух-трех фотографий. при выборе записей из db, очевидно, мы получим одну и ту же информацию пользователя с разными именами фотографий и тегом отображения, чтобы отобразить всю эту повторяющуюся информацию. так может ли кто-нибудь предложить способ преодолеть это, чтобы он отображал одну запись пользователя со всем именем его загруженных фотографий. – user1184777

2

Общая идея: Использовать Set, а не List. Но вы должны переопределить хэш и равные классу.

+0

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

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