背景
最近有一个需求,从服务端请求数据拿到一个数组,塞到list里面后,在后面某个地方需要通过具体的Element去找到它在list中的index,很简单对不对,直接list.indexOf(e) 不就好了么?
奇怪的地方
举个例子
Data 是数据实体Bean,比如存在两个属性,name和address
var data1 = Data("张三","北京朝阳区")
var data2 = Data("李四","北京海淀区")
var data3 = Data("王五","北京朝阳区")
dataList.add(data1)
dataList.add(data2)
dataList.add(data3)
val index = dataList.indexOf(data3)
这时候index 值居然为0,这让我很困惑,我明明取的第三个对象的index,值怎么会为0,后来点进去看了一下源码,找到AbstractList
突然想起 kotlin中 == 不就是equals么,但是我没有重写实体类的equals方法和hashCode方法,那搞个鸡儿
解决
@Parcelize
data class FilterModel(
var isLine: Boolean = false
) : Parcelable {
val id: Int = 0
val name: String = ""
//重写hashCode和equals方法即可
override fun hashCode(): Int {
var result = 1
result = 31 * result + id.hashCode()
result = 31 * result + name.hashCode()
return result
}
override fun equals(other: Any?): Boolean {
if (other !is FilterModel) {
return false
}
return id == other.id
&& name == other.name
}
}