2012-03-07 207 views
1

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

回答

1

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

只记得重写散列和等于方法。

如果您添加到您的bean的一切都应该工作:

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

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

提问者正在将列表添加到一个集合中,以尝试重复数据删除,但这不起作用。 – Jim 2012-03-07 10:41:04

+0

当然,它不工作,他没有实施散列和等于... – hurtledown 2012-03-07 10:45:58

+0

谢谢吉姆。在将它包含到bean中后,如何调用它会隐式调用,还是需要显式调用@ jim – user1184777 2012-03-07 11:36:24

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

家伙更主要的是我必须得到用户的充分信息,并连同显示,如姓名年龄地址他们的信息..等他们上传的照片名称在struts中使用显示标签,因为你已经知道每个用户都有超过两到三张照片。同时从db中选择记录显然我们会得到具有不同照片名称的相同用户信息,显示标签将显示所有重复信息。所以任何人都可以提出一种方法来解决这个问题,这样它就可以显示一个用户记录和一个上传的照片名称。 – user1184777 2012-03-09 05:21:06

2

总体构思:使用Set而不是List。但是你必须重写哈希和类的等号。

+0

这是建议的方式 - 因为代码更具可读性,并且使用标准接口有助于将您的课程理念传达给读取代码的其他人。 – Gangadhar 2012-03-07 10:41:15