今天又踩了一個坑,故事是這樣的:項目中用到@功能,在點擊@的時候,顯示用戶關注的用戶列表,為了改善用戶體驗(用戶基本都@那么幾個人),要把@ 的歷史記錄添加到用戶關注的用戶列表中,并移除重復的用戶。
先說下我的思路:
1、拿到關注的用戶和歷史@用戶;
2、使用removeAll()和addAll()操作這兩個list拿到要顯示的list
List<User> users = event.data;
if (!StringUtil.isEmpty(mAtUserHistoryStr)) {
mAtUserHistoryList = JSON.parseArray(mAtUserHistoryStr, User.class);
users.removeAll(mAtUserHistoryList);
users.addAll(0, mAtUserHistoryList);
}
showList(users);
3、在用戶@好友的時候更新歷史@記錄
4、把歷史@記錄轉為JSON存到SP中
private void updateRecentAtUser(User item) {
mAtUserHistoryList.remove(item);
mAtUserHistoryList.add(0, item);
mAtUserHistoryStr = JSON.toJSONString(mAtUserHistoryList);
SPUtils.getInstance().put(Consts.SP_KEY_AT_USER_HISTORY, mAtUserHistoryStr);
}
按照以上步驟寫代碼,寫完后,運行程序卻發現removeAll并沒有生效,調試了下返回值為false。百思不得姐,于是就上網搜索了一下,如何使用Java List等集合類的removeAll方法 (⊙﹏⊙)b 呵呵、前段時間同事還問我重寫equals方法的問題呢,這會兒自己居然忘記重寫了。
在此記錄一下
在執行removeAll方法時是通過equals方法來判斷集合元素是否相等的,如果沒有Override equals方法,其默認的仍是比較對象,所以會出現上述問題!
歸根到底,還是基礎沒有掌握牢固,同時也給自己提了個醒,寫實體類時盡量Override hashCode和equals方法,不這樣說不定哪天就會出問題。
問題綜述完畢,當然,這個問題實質上很簡單,只希望給遇到有同樣疑問的朋友一點幫助。
貼上代碼:
public class User extends Model implements Serializable {
// uid 用戶id (ActiveRecord內部已占用了id字段)
@Column(unique = true, onUniqueConflict = Column.ConflictAction.REPLACE)
public long uid;
@Column
public String name;
@Column
public int countAnswer;//回答次數
@Column
public int countVote;// 被贊次數
@Column
public int countFocused;// 粉絲數
@Column
public boolean focusedByMe;// 我是否關注了此用戶
@Column
public boolean focusingMe;// 此用戶是否關注了我
public String signature;// 用戶個性簽名
//每個ActiveRecord model都必須有默認構造函數
public User() {super();}
public User(long uid,String name){
super();
this.uid = uid;
this.name = name;
}
//重寫equals方法
@Override
public boolean equals(Object o) {
return o instanceof User
&& this.uid == ((User)o).uid
&& this.name.equals(((User)o).name);
}
}