删除列表中的重复记录

时间:2012-03-07 10:30:19

标签: java list struts2

您正在开发我的一个Web应用程序时我将用户信息存储到基于执行的sql查询的ArrayList中,它包含重复的对象如何删除列表中的重复对象,我已经尝试了一些方法但它仍然无法正常工作。 这是我的代码纠正我的错误

      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类是

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

4 个答案:

答案 0 :(得分:2)

一般理念:使用Set,而不是List。但是你必须覆盖类的哈希和等号。

答案 1 :(得分:1)

如果你想要一个没有特定订单的对象集合并且你不想要重复,那么你最好只使用一个像HashSet这样的Set,或者,如果在你的集合中,顺序很重要, TreeSet。

请记住重写hash和equals方法。

如果你将它添加到你的bean中,一切都应该有效:

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

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

答案 2 :(得分: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子句。

答案 3 :(得分: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中删除欺骗的想法。