我有一个两层数组,外层已经按shop id进行了分组和排序,我希望在不更改外层的顺序的情况下,通过markdown 对内层进行排序.

// Inner struct
type product struct {
    name   string
    price  int64
    shopId int64
}

// Outer struct
type oneGroup struct {
    shopId   int64
    products []*product
}

// Final Outer array
var groupOut []oneGroup

Linq的输入应为[groupOut]

我利用Linq对外层进行了分组和排序(按照分组后分组中的最大价格降序对外层进行分组和排序).但不知道如何处理内层.

products := make([]*product, 0, 20)
products = append(products, &product{name: "product66", price: 6666, shopId: 100})
products = append(products, &product{name: "product11", price: 1111, shopId: 100})
products = append(products, &product{name: "product44", price: 4444, shopId: 100})

products = append(products, &product{name: "product22", price: 2222, shopId: 200})
products = append(products, &product{name: "product77", price: 9999, shopId: 200})
products = append(products, &product{name: "product00", price: 0000, shopId: 200})

products = append(products, &product{name: "product33", price: 3333, shopId: 300})
products = append(products, &product{name: "product88", price: 8888, shopId: 300})
products = append(products, &product{name: "product55", price: 5555, shopId: 300})

products = append(products, &product{name: "product99", price: 7777, shopId: 400})

var query []linq.Group

//Grouping and sorting outer layers in descending order according to the largest price in the group after grouping
linq.From(products).GroupByT(
    func(p *product) int64 { return p.shopId },
    func(p *product) *product { return p },
).OrderByT(
    func(g linq.Group) int64 {
        //return g.Key.(int64)
        return linq.From(g.Group).Select(
            func(x interface{}) interface{} { return x.(*product).price },
        ).Max().(int64)

    },
).ToSlice(&query)

推荐答案

首先,构建一个产品的有序查询,该查询先按shop ID排序,然后按降序按价格排序.

这允许相应地对每个组的内部数组进行排序.

package main

import (
    "fmt"

    "github.com/ahmetb/go-linq/v3"
)

// Inner struct
type product struct {
    name   string
    price  int64
    shopId int64
}
func (x product) String() string { return fmt.Sprintf("<%s, [%d]> ", x.name, x.price) }

// Outer struct
type oneGroup struct {
    shopId   int64
    products []*product
}

// Final Outer array
var groupOut []oneGroup

func main() {
    products := make([]*product, 0, 20)
    products = append(products, &product{name: "product66", price: 6666, shopId: 100})
    products = append(products, &product{name: "product11", price: 1111, shopId: 100})
    products = append(products, &product{name: "product44", price: 4444, shopId: 100})

    products = append(products, &product{name: "product22", price: 2222, shopId: 200})
    products = append(products, &product{name: "product77", price: 9999, shopId: 200})
    products = append(products, &product{name: "product00", price: 0000, shopId: 200})

    products = append(products, &product{name: "product33", price: 3333, shopId: 300})
    products = append(products, &product{name: "product88", price: 8888, shopId: 300})
    products = append(products, &product{name: "product55", price: 5555, shopId: 300})

    products = append(products, &product{name: "product99", price: 7777, shopId: 400})

    var query []linq.Group
    // Sort products first by shopId and the price in descending order
    var productsByShopIdAndPrice linq.OrderedQuery = linq.From(products).OrderByT(func(p interface{}) int64  {
        return p.(*product).shopId
    }).ThenByDescending(func(p interface{}) interface{} {
        return p.(*product).price
    })
    // Grouping and sorting outer layers in descending order according to the largest price in the group after grouping
    productsByShopIdAndPrice.GroupByT(
        func(p *product) int64 { return p.shopId },
        func(p *product) *product { return p },
    ).OrderByT(
        func(g linq.Group) int64 {
            //return g.Key.(int64)
            return linq.From(g.Group).Select(
                func(x interface{}) interface{} { return x.(*product).price },
            ).Max().(int64)

        },
    ).ToSlice(&query)
    fmt.Printf("%v \n", query)
}

Go相关问答推荐

未对GoFr中的所有请求进行跟踪

Wamtime Memory中的‘Offset’是什么?Read?

在Go中旋转矩阵

我可以在Golang中的另一个类型参数的基础上约束一个类型的参数吗?

如何根据中间件的请求设置上下文值?获取 go-staticcheck 问题

仅使用公共 api 对 alexedwards/scs 进行简单测试

为什么我只收到部分错误而不是我启动的 goroutines 的所有错误?

使用 Grafana alert 在几分钟内重复alert

在 Gorm 的 AfterFind() 钩子中获取智能 Select struct 的值

如何将一片十六进制字节转换为整数

有没有办法将 yaml node 添加到 golang 中现有的 yaml 文档中?

Golang模板无法访问embedFS中的文件

在 Go 中发送 ack 和 term 后消息仍在 nats 限制队列中

如何使用golang操作很长的字符串以避免内存不足

golang 如何从字符串中查找表情符号?

如何从字符串中删除多个换行符`\n`但只保留一个?

(如何)我可以基于接口抽象地实现Stringer吗?

如何访问Go 1.18泛型 struct (structs)中的共享字段

在 etcd 键值存储中禁用历史记录

有没有一种方法可以确保传递的值具有使用泛型的某些字段?