2012-03-07 211 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