您正在开发我的一个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..
答案 0 :(得分:2)
答案 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中删除欺骗的想法。