除一个字段以外,按对象分组列表

发布于 2025-02-12 02:20:05 字数 3036 浏览 2 评论 0原文

如果项目字段相同,我必须将项目列出。在我的代码上方,如果每个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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

也只是曾经 2025-02-19 02:20:05

您必须用无意义的ID替换ID(例如,在我的示例中-1):

data class Product(
  val id: Int,
  val name: String,
  val price: Int,
  val quantity: Int
)

data class GroupedProduct(
  val product: Product,
  val count: Int,
  val totalQuantity: Int,
  val isGroup: Boolean
)

var products = listOf(
  Product(1, "p1", 10, 2),
  Product(2, "p1", 10, 2),
  Product(3, "p1", 10, 2),
  Product(4, "p2", 12, 1),
  Product(5, "p3", 12, 1),
)

val result = products
  .groupBy { it.copy(id = -1) }
  .map { (_, values) ->
    val product = values.first().copy(id = -1, quantity = values.sumOf { it.quantity })  
    GroupedProduct(product, values.count(), values.sumOf { it.quantity }, values.count() > 1)
  }

result.forEach(::println)

输出:

GroupedProduct(product=Product(id=-1, name=p1, price=10, quantity=6), count=3, totalQuantity=6, isGroup=true)
GroupedProduct(product=Product(id=-1, name=p2, price=12, quantity=1), count=1, totalQuantity=1, isGroup=false)
GroupedProduct(product=Product(id=-1, name=p3, price=12, quantity=1), count=1, totalQuantity=1, isGroup=false)

You must replace the id with a meaningless id (like -1 in my example):

data class Product(
  val id: Int,
  val name: String,
  val price: Int,
  val quantity: Int
)

data class GroupedProduct(
  val product: Product,
  val count: Int,
  val totalQuantity: Int,
  val isGroup: Boolean
)

var products = listOf(
  Product(1, "p1", 10, 2),
  Product(2, "p1", 10, 2),
  Product(3, "p1", 10, 2),
  Product(4, "p2", 12, 1),
  Product(5, "p3", 12, 1),
)

val result = products
  .groupBy { it.copy(id = -1) }
  .map { (_, values) ->
    val product = values.first().copy(id = -1, quantity = values.sumOf { it.quantity })  
    GroupedProduct(product, values.count(), values.sumOf { it.quantity }, values.count() > 1)
  }

result.forEach(::println)

Output:

GroupedProduct(product=Product(id=-1, name=p1, price=10, quantity=6), count=3, totalQuantity=6, isGroup=true)
GroupedProduct(product=Product(id=-1, name=p2, price=12, quantity=1), count=1, totalQuantity=1, isGroup=false)
GroupedProduct(product=Product(id=-1, name=p3, price=12, quantity=1), count=1, totalQuantity=1, isGroup=false)
山川志 2025-02-19 02:20:05

将分组更改为

products.groupBy { Triple(it.name, it.price, it.quantity) }.forEach {
    if (it.value.size > 1)
        groupedPersons.add(GroupedProduct(it.value.first(), it.value.size, it.value.getTotalQuantity(), true))
    else
        groupedPersons.add(GroupedProduct(it.value.first(), it.value.size, it.value.size, false))
}

Change the grouping to

products.groupBy { Triple(it.name, it.price, it.quantity) }.forEach {
    if (it.value.size > 1)
        groupedPersons.add(GroupedProduct(it.value.first(), it.value.size, it.value.getTotalQuantity(), true))
    else
        groupedPersons.add(GroupedProduct(it.value.first(), it.value.size, it.value.size, false))
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文