Java 删除列表中的重复记录

Java 删除列表中的重复记录,java,list,struts2,Java,List,Struts2,嗨,在开发我的一个web应用程序时,我正在基于执行的sql查询将用户信息存储到ArrayList中,它包含重复对象如何删除列表中的重复对象,我已经尝试了一些方法,但仍然不起作用。 这是我的代码纠正我的错误 public ArrayList loadData() throws ClassNotFoundException, SQLException { ArrayList userList = new ArrayList(); String url = "";

嗨,在开发我的一个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类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..

必须在SQL级别删除所有重复项。您的SQL表明它可能正在生成重复记录

String query = "SELECT NAME,FATHERNAME,AGE,ADDRESS,ID,FILEPATH FROM USER_INFORMATION ,USER_PHOTO WHERE ID=USER_ID";
子句
ID=USER\u ID
是什么意思?您不应该将该值作为输入传入查询吗


此外,列
ID
是主键吗?否则,请使用不生成重复项的where子句。

您的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中的重复项的想法。

一般想法:使用,而不是。但是您必须重写类的哈希和等号。

如果您想要一个没有特定顺序的对象集合,并且不想要重复的对象,最好只使用一个集合,例如HashSet,或者,如果在集合中顺序很重要,则使用TreeSet

请记住重写hash和equals方法

如果将此项添加到bean中,一切都应该正常工作:

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

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

询问者正在将列表添加到集合中以尝试重复数据消除,但这不起作用。谢谢Jim。在将它包含到bean中之后,确定如何调用它将隐式调用它,还是我们需要显式调用它。@jim当您调用hs.add(x)时,将隐式调用equals,并且仅当没有元素y使得x.equals(y)时才添加项是真的。感谢各位,它现在工作得很好@jim这是建议的方式-因为代码更具可读性,而且使用标准接口有助于让阅读您的代码的其他人了解您的类。各位,主要的是我必须获得用户的完整信息,并显示他们的信息,如姓名、年龄和地址。。etc以及使用struts中的display标签上传的照片名称,因为您已经知道每个用户都有两到三张以上的照片。当从数据库中选择记录时,我们显然会得到相同的用户信息,但照片名称和显示标签会显示所有重复的信息。因此,任何人都可以提出一种克服这一问题的方法,让它显示一个用户记录和他上传的所有照片名称。