Java 删除列表中的重复记录
嗨,在开发我的一个web应用程序时,我正在基于执行的sql查询将用户信息存储到ArrayList中,它包含重复对象如何删除列表中的重复对象,我已经尝试了一些方法,但仍然不起作用。 这是我的代码纠正我的错误Java 删除列表中的重复记录,java,list,struts2,Java,List,Struts2,嗨,在开发我的一个web应用程序时,我正在基于执行的sql查询将用户信息存储到ArrayList中,它包含重复对象如何删除列表中的重复对象,我已经尝试了一些方法,但仍然不起作用。 这是我的代码纠正我的错误 public ArrayList loadData() throws ClassNotFoundException, SQLException { ArrayList userList = new ArrayList(); String url = "";
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标签上传的照片名称,因为您已经知道每个用户都有两到三张以上的照片。当从数据库中选择记录时,我们显然会得到相同的用户信息,但照片名称和显示标签会显示所有重复的信息。因此,任何人都可以提出一种克服这一问题的方法,让它显示一个用户记录和他上传的所有照片名称。