user1184777
user1184777

Reputation: 1027

removing duplicate records in list

Hi while developing one of my web application i am storing the user information in to an ArrayList based on sql query executed, it contain duplicate objects how to remove duplicate objects in list , i already tried some method but it still not working. This Is My Code Correct me where i am wrong

      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;
}

And My Bean Class contant is

    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..

Upvotes: 1

Views: 1420

Answers (4)

hurtledown
hurtledown

Reputation: 669

If you want a Collection of objects that does not have a specific order and you don't want duplicates, it's better for you just to use a Set like for example HashSet, or, if in your set the order is important, the TreeSet.

Just remember to override the hash and equals methods.

if you add this to your bean everything should work:

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

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

Upvotes: 1

adarshr
adarshr

Reputation: 62603

All duplicates must be removed at an SQL level. Your SQL is suggesting that it could be generating duplicate records.

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

What does the clause ID = USER_ID mean? Shouldn't you be passing in that value as an input to your query?

Also, is the column ID a primary key? Otherwise, use a where clause that doesn't generate duplicates.

Upvotes: 0

Kiril Kirilov
Kiril Kirilov

Reputation: 11257

General Idea: Use Set, not List. But you must override hash and equals of the class.

Upvotes: 2

Jim
Jim

Reputation: 22656

Your userdata class does not implement equals or hashcode. This means two instances created with the same values will not be counted as duplicates. This is why the set contains duplicates.

For example

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

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

u1 and u2 are not considered equal as they are different objects. Adding an equals and hashcode method should fix this. However even better is adarshr's idea of removing dupes in the SQL.

Upvotes: 0

Related Questions