3 回答
TA贡献1906条经验 获得超3个赞
您应该使用数据类。它将equals()在内部包含覆盖方法:
data class TypeItems(
val car_typetype: String,
val typetype: String,
val modeletype: String,
val phtype: String
)
在深入研究这个问题之后,我发现,你不能在集合get()上调用方法Set。所以,这段代码不起作用: (p0 as ItemView).bind(list[p1].cartype, list[p1].typetype, list[p1].modeltype, list[p1].photype)
总结,Set不会帮助你。要解决您的问题,您只需要调用防御检查:
val typeItems = TypeItems(
product.getString("car_type"),
product.getString("type"),
product.getString("model"),
url2
)
if(!list.contains(typeItems)) {
list.add(typeItems)
}
因此,还有另一种方法可以解决此问题:不是
val adapter = TypeAdapter(this.applicationContext, list)
调用
val adapter = TypeAdapter(this.applicationContext, list.distinct())
方法,而是distinct()以相同的顺序返回列表的唯一值。不要忘记让它成为数据类。
TA贡献1824条经验 获得超8个赞
请注意,接受的答案建议list.contains(x)在可能将元素添加到列表之前使用。但是,contains需要 O(n) 并且您正在对响应中得到的每个项目进行检查,因此您的总复杂度为 O(n^2)。如果你有很多项目,性能可能会很差,这意味着你的应用程序可能没有响应,用户体验可能会受到影响。此外,项目按插入顺序排序,因此我们需要按所需顺序对其进行显式排序——至少添加另一个 O(n*log(n)),尽管它由之前的 O(n^2) 支配。
因此, ATreeSet可能更适合这个特定的用例——正如@Rogue 和@taha 所建议的那样——因为它自动防止重复,它在插入时具有 O(log(n)) 的复杂性,并且它强制执行某种排序。
以下是如何使用它的示例:
data class TypeItems(
val car: String,
val type: String,
val model: String,
val ph: String
)
fun main() {
// simulates a response from the server
val response = listOf(
TypeItems("carBBB", "typeBBB", "modelBBB", "phBBB"),
TypeItems("carAAA", "typeAAA", "modelAAA", "phAAA"),
TypeItems("carAAA", "typeAAA", "modelAAA", "phAAA"),
TypeItems("carCCC", "typeZZZ", "modelYYY", "phCCC"),
TypeItems("carCCC", "typeXXX", "modelWWW", "phCCC"),
TypeItems("carCCC", "typeXXX", "modelVVV", "phCCC")
)
// creates an empty TreeSet with the desired sorting
val set = TreeSet<TypeItems>(
Comparator.comparing(TypeItems::car)
.thenComparing(TypeItems::type)
.thenComparing(TypeItems::model)
.thenComparing(TypeItems::ph) // needed for "consistency with equals"
)
// add each element to the set, it'll handle duplicates
response.forEach { set.add(it) }
// do something with the resulting set: print each item on a new line
set.forEach {
println(it)
}
}
那会打印:
TypeItems(car=carAAA, type=typeAAA, model=modelAAA, ph=phAAA) // duplicate removed
TypeItems(car=carBBB, type=typeBBB, model=modelBBB, ph=phBBB) // car order enforced (as B > A)
TypeItems(car=carCCC, type=typeXXX, model=modelVVV, ph=phCCC) // type order enforced (as X > B)
TypeItems(car=carCCC, type=typeXXX, model=modelWWW, ph=phCCC) // model order enforced (as W > V)
TypeItems(car=carCCC, type=typeZZZ, model=modelYYY, ph=phCCC)
TA贡献1793条经验 获得超6个赞
替换val list= ArrayList<TypeItems>()为val set = SortedSet<TypeItems>()
并覆盖 TypeItems 的 equals 方法:
override fun equals(other: Any?): Boolean {
if (other is TypeItems) {
other.cartype == this.cartype && ... // replace TypeItems fields
} else {
false
}
}
另外如果你想排序,TypeItems 必须实现Comparable https://docs.oracle.com/javase/8/docs/api/java/util/SortedSet.html
添加回答
举报