除一个字段以外,按对象分组列表
如果项目字段相同,我必须将项目列出。在我的代码上方,如果每个ID都相同,则可以使用我想要的。但是产品ID是独一无二的。因此,我无法进行正确的分组。
在这里,我写了一个示例产品模型,但原始产品模型具有20多个字段,其中一些是对象列表。产品模型来自API。
除了ID之外,我想按项目进行分组。
data class Product(
val id: Int,
val name: String,
val price: Int,
val quantity: Int,
val subModels: List<SubModel>,
val values: List<String>
)
data class SubModel(
val name: String,
val value: String
)
data class GroupedProduct(
val product: Product,
val count: Int,
val totalQuantity: Int,
val isGroup: Boolean
)
var products = listOf(
Product(1, "p1", 10, 2, listOf(SubModel("a", "1")), listOf("a")),
Product(1, "p1", 10, 2, listOf(SubModel("a", "1")), listOf("a")),
Product(1, "p1", 10, 2, listOf(SubModel("b", "2")), listOf("a")),
Product(1, "p2", 12, 1, listOf(SubModel("a", "1")), listOf("a")),
Product(1, "p3", 12, 1, listOf(SubModel("a", "1")), listOf("a")),
)
var groupedPersons: MutableList<GroupedProduct> = mutableListOf()
products.groupBy { it }.forEach {
if (it.value.size > 1)
groupedPersons.add(GroupedProduct(it.key, it.value.size, it.value.getTotalQuantity(), true))
else
groupedPersons.add(GroupedProduct(it.key, it.value.size, it.value.size, false))
}
fun List<Product>.getTotalQuantity(): Int {
var totalQuantity = 0
forEach {
totalQuantity += it.quantity
}
return totalQuantity
}
groupedPersons.forEach {
println(it)
}
打印:
GroupedProduct(product=Product(id=1, name=p1, price=10, quantity=2, subModels=[SubModel(name=a, value=1)], values=[a]), count=2, totalQuantity=4, isGroup=true)
GroupedProduct(product=Product(id=1, name=p1, price=10, quantity=2, subModels=[SubModel(name=b, value=2)], values=[a]), count=1, totalQuantity=1, isGroup=false)
GroupedProduct(product=Product(id=1, name=p2, price=12, quantity=1, subModels=[SubModel(name=a, value=1)], values=[a]), count=1, totalQuantity=1, isGroup=false)
GroupedProduct(product=Product(id=1, name=p3, price=12, quantity=1, subModels=[SubModel(name=a, value=1)], values=[a]), count=1, totalQuantity=1, isGroup=false)
当项目ID为不同的分组时,结果显然是这样。
GroupedProduct(product=Product(id=1, name=p1, price=10, quantity=2, subModels=[SubModel(name=a, value=1)], values=[a]), count=1, totalQuantity=1, isGroup=false)
GroupedProduct(product=Product(id=2, name=p1, price=10, quantity=2, subModels=[SubModel(name=a, value=1)], values=[a]), count=1, totalQuantity=1, isGroup=false)
GroupedProduct(product=Product(id=3, name=p1, price=10, quantity=2, subModels=[SubModel(name=b, value=2)], values=[a]), count=1, totalQuantity=1, isGroup=false)
GroupedProduct(product=Product(id=4, name=p2, price=12, quantity=1, subModels=[SubModel(name=a, value=1)], values=[a]), count=1, totalQuantity=1, isGroup=false)
GroupedProduct(product=Product(id=5, name=p3, price=12, quantity=1, subModels=[SubModel(name=a, value=1)], values=[a]), count=1, totalQuantity=1, isGroup=false)
I have to group list items if the items fields are the same. Above in my code, it works what I want if every id is the same. But product ids are unique. For that reason, I cant make the right grouping.
Here I wrote an example product model but original product model has 20+ fields and some of them are object list. Product model is came from api.
I want to make grouping by item except for id.
data class Product(
val id: Int,
val name: String,
val price: Int,
val quantity: Int,
val subModels: List<SubModel>,
val values: List<String>
)
data class SubModel(
val name: String,
val value: String
)
data class GroupedProduct(
val product: Product,
val count: Int,
val totalQuantity: Int,
val isGroup: Boolean
)
var products = listOf(
Product(1, "p1", 10, 2, listOf(SubModel("a", "1")), listOf("a")),
Product(1, "p1", 10, 2, listOf(SubModel("a", "1")), listOf("a")),
Product(1, "p1", 10, 2, listOf(SubModel("b", "2")), listOf("a")),
Product(1, "p2", 12, 1, listOf(SubModel("a", "1")), listOf("a")),
Product(1, "p3", 12, 1, listOf(SubModel("a", "1")), listOf("a")),
)
var groupedPersons: MutableList<GroupedProduct> = mutableListOf()
products.groupBy { it }.forEach {
if (it.value.size > 1)
groupedPersons.add(GroupedProduct(it.key, it.value.size, it.value.getTotalQuantity(), true))
else
groupedPersons.add(GroupedProduct(it.key, it.value.size, it.value.size, false))
}
fun List<Product>.getTotalQuantity(): Int {
var totalQuantity = 0
forEach {
totalQuantity += it.quantity
}
return totalQuantity
}
groupedPersons.forEach {
println(it)
}
Prints:
GroupedProduct(product=Product(id=1, name=p1, price=10, quantity=2, subModels=[SubModel(name=a, value=1)], values=[a]), count=2, totalQuantity=4, isGroup=true)
GroupedProduct(product=Product(id=1, name=p1, price=10, quantity=2, subModels=[SubModel(name=b, value=2)], values=[a]), count=1, totalQuantity=1, isGroup=false)
GroupedProduct(product=Product(id=1, name=p2, price=12, quantity=1, subModels=[SubModel(name=a, value=1)], values=[a]), count=1, totalQuantity=1, isGroup=false)
GroupedProduct(product=Product(id=1, name=p3, price=12, quantity=1, subModels=[SubModel(name=a, value=1)], values=[a]), count=1, totalQuantity=1, isGroup=false)
When item ids are different grouping results be like that obviously.
GroupedProduct(product=Product(id=1, name=p1, price=10, quantity=2, subModels=[SubModel(name=a, value=1)], values=[a]), count=1, totalQuantity=1, isGroup=false)
GroupedProduct(product=Product(id=2, name=p1, price=10, quantity=2, subModels=[SubModel(name=a, value=1)], values=[a]), count=1, totalQuantity=1, isGroup=false)
GroupedProduct(product=Product(id=3, name=p1, price=10, quantity=2, subModels=[SubModel(name=b, value=2)], values=[a]), count=1, totalQuantity=1, isGroup=false)
GroupedProduct(product=Product(id=4, name=p2, price=12, quantity=1, subModels=[SubModel(name=a, value=1)], values=[a]), count=1, totalQuantity=1, isGroup=false)
GroupedProduct(product=Product(id=5, name=p3, price=12, quantity=1, subModels=[SubModel(name=a, value=1)], values=[a]), count=1, totalQuantity=1, isGroup=false)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
您必须用无意义的ID替换ID(例如,在我的示例中-1):
输出:
You must replace the id with a meaningless id (like -1 in my example):
Output:
将分组更改为
Change the grouping to