登录
首页 >  Golang >  Go问答

对内部数组进行排序:使用 LINQ

来源:stackoverflow

时间:2024-03-08 08:03:27 316浏览 收藏

哈喽!今天心血来潮给大家带来了《对内部数组进行排序:使用 LINQ》,想必大家应该对Golang都不陌生吧,那么阅读本文就都不会很困难,以下内容主要涉及到,若是你正在学习Golang,千万别错过这篇文章~希望能帮助到你!

问题内容

我有一个两层数组,外层已经按照shopid分组排序,我想在不改变外层顺序的情况下对内层按价格降序排序。

// 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)

正确答案


首先,构建一个按 shopid 排序的产品有序查询,然后按价格降序排列。

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

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)
}

本篇关于《对内部数组进行排序:使用 LINQ》的介绍就到此结束啦,但是学无止境,想要了解学习更多关于Golang的相关知识,请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>