今天又踩了一个坑,故事是这样的:项目中用到@功能,在点击@的时候,显示用户关注的用户列表,为了改善用户体验(用户基本都@那么几个人),要把@ 的历史记录添加到用户关注的用户列表中,并移除重复的用户。
先说下我的思路:
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);
}
}