golang将切片或数组进行分组
例子一:
golang 数组分割
需求:给定一个数组和一个正整数,要求把数组分割成多个正整数大小的数组,如果不够分,则最后一个数组分到剩余的所有元素。
package main
import (
"fmt"
)
func main() {
//demo01()
//demo02()
demo03()
}
func demo01() {
arr := []int{1, 2, 3, 4, 5, 6, 7, 8, 9,10}
fmt.Println(arr) //[1 2 3 4 5 6 7 8 9 10]
res:= ArrayInGroupsOf(arr,2) //[[1 2] [3 4] [5 6] [7 8] [9 10]]
fmt.Println(res)
}
func demo02() {
arr := [][]string{{"1", "2"},{"3", "4"},{"5", "6"},{"7", "8"},{"9","10"}}
fmt.Println(arr) //[[1 2] [3 4] [5 6] [7 8] [9 10]]
res:= ArrayTwoStringGroupsOf(arr,5) //[[[1 2] [3 4]] [[5 6] [7 8]] [[9 10]]]
fmt.Printf("%+v",res)
}
type student struct {
name string
age int
}
func demo03() {
stus := []student{
{name: "小王子", age: 18},
{name: "娜扎", age: 23},
{name: "大王八", age: 9000},
{name: "大王八1", age: 9000},
{name: "大王八2", age: 9000},
{name: "大王八3", age: 9000},
{name: "大王八4", age: 9000},
}
fmt.Printf("%+v\n",stus)
//[{name:小王子 age:18} {name:娜扎 age:23} {name:大王八 age:9000} {name:大王八1 age:9000} {name:大王八2 age:9000} {name:大王八3 age:9000} {name:大王八4 age:9000}]
res:= ArrayStruGroupsOf(stus,3) //[[[1 2] [3 4]] [[5 6] [7 8]] [[9 10]]]
fmt.Printf("%+v\n",res)
//[[{name:小王子 age:18} {name:娜扎 age:23} {name:大王八 age:9000}] [{name:大王八1 age:9000} {name:大王八2 age:9000} {name:大王八3 age:9000}] [{name:大王八4 age:9000}]]
}
/*
示例3:
数组:[{name:小王子 age:18} {name:娜扎 age:23} {name:大王八 age:9000} {name:大王八1 age:9000} {name:大王八2 age:9000} {name:大王八3 age:9000} {name:大王八4 age:9000}],正整数:2
期望结果: [[{name:小王子 age:18} {name:娜扎 age:23} {name:大王八 age:9000}] [{name:大王八1 age:9000} {name:大王八2 age:9000} {name:大王八3 age:9000}] [{name:大王八4 age:9000}]]
调用: res:= arrayStruGroupsOf(arr,2)
*/
func ArrayStruGroupsOf(stu []student, num int64) [][]student {
max := int64(len(stu))
//判断数组大小是否小于等于指定分割大小的值,是则把原数组放入二维数组返回
if max <= num {
return [][]student{stu}
}
//获取应该数组分割为多少份
var quantity int64
if max%num == 0 {
quantity = max / num
} else {
quantity = (max / num) + 1
}
//声明分割好的二维数组
var segments = make([][]student, 0)
//声明分割数组的截止下标
var start, end, i int64
for i = 1; i <= quantity; i++ {
end = i * num
if i != quantity {
segments = append(segments, stu[start:end])
} else {
segments = append(segments, stu[start:])
}
start = i * num
}
return segments
}
/*
示例1:
数组:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],正整数:2
期望结果: [[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]]
调用: res:= arrayInGroupsOf(arr,2)
*/
func ArrayInGroupsOf(arr []int, num int64) [][]int {
max := int64(len(arr))
//判断数组大小是否小于等于指定分割大小的值,是则把原数组放入二维数组返回
if max <= num {
return [][]int{arr}
}
//获取应该数组分割为多少份
var quantity int64
if max%num == 0 {
quantity = max / num
} else {
quantity = (max / num) + 1
}
//声明分割好的二维数组
var segments = make([][]int, 0)
//声明分割数组的截止下标
var start, end, i int64
for i = 1; i <= quantity; i++ {
end = i * num
if i != quantity {
segments = append(segments, arr[start:end])
} else {
segments = append(segments, arr[start:])
}
start = i * num
}
return segments
}
/*
示例2:
数组:[[1 2] [3 4] [5 6] [7 8] [9 10]],正整数:2
期望结果: [[[1 2] [3 4]] [[5 6] [7 8]] [[9 10]]]
调用: res:= arrayTwoStringGroupsOf(arr,2)
*/
func ArrayTwoStringGroupsOf(arr [][]string, num int64) [][][]string {
max := int64(len(arr))
//判断数组大小是否小于等于指定分割大小的值,是则把原数组放入二维数组返回
if max <= num {
return [][][]string{arr}
}
//获取应该数组分割为多少份
var quantity int64
if max%num == 0 {
quantity = max / num
} else {
quantity = (max / num) + 1
}
//声明分割好的二维数组
var segments = make([][][]string, 0)
//声明分割数组的截止下标
var start, end, i int64
for i = 1; i <= quantity; i++ {
end = i * num
if i != quantity {
segments = append(segments, arr[start:end])
} else {
segments = append(segments, arr[start:])
}
start = i * num
}
return segments
}
原文链接:https://blog.csdn.net/MCJPAO/article/details/108431657
例子二
golang将切片或数组根据某个字段进行分组
package main
import (
"fmt"
"sort"
)
type Person struct {
Name string
Age int
}
func main() {
p1 := Person{"Tom",20}
p2 := Person{"Lily",21}
p3 := Person{"Linda",23}
p4 := Person{"Jass",25}
p5 := Person{"Tonny",20}
p6 := Person{"Pite",25}
p7 := Person{"Paul",21}
p8 := Person{"Kriss",27}
p9 := Person{"Jake",23}
p10 := Person{"Rose",20}
personList := []Person{}
personList = append(personList,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10)
fmt.Println("分组前的数据:",personList)
fmt.Println("分组后的数据:",splitSlice(personList))
}
//按某个字段排序
type sortByAge []Person
func (s sortByAge) Len() int { return len(s) }
func (s sortByAge) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
func (s sortByAge) Less(i, j int) bool { return s[i].Age < s[j].Age}
//切片分组
func splitSlice(list []Person) [][]Person {
sort.Sort(sortByAge(list))
returnData := make([][]Person,0)
i:= 0
var j int
for {
if i >= len(list) {
break
}
for j = i + 1; j< len(list) && list[i].Age == list [j].Age; j++ {}
returnData = append(returnData,list[i:j])
i = j
}
return returnData
}
输出:
分组前的数据: [{Tom 20} {Lily 21} {Linda 23} {Jass 25} {Tonny 20} {Pite 25} {Paul 21} {Kriss 27} {Jake 23} {Rose 20}]
分组后的数据: [[{Tom 20} {Rose 20} {Tonny 20}] [{Lily 21} {Paul 21}] [{Linda 23} {Jake 23}] [{Pite 25} {Jass 25}] [{Kriss 27}]]
golang将切片或数组进行分组的更多相关文章
- golang切片和数组的区别
好久的没有写博客了,这段时间没事研究了下go这门语言. 我们先介绍下go中的数组和切片的区别和用法 说了这么多 我们先来看段代码吧 var arr1 [3]int var arr2 [3]int = ...
- [Golang学习笔记] 07 数组和切片
01-06回顾: Go语言开发环境配置, 常用源码文件写法, 程序实体(尤其是变量)及其相关各种概念和编程技巧: 类型推断,变量重声明,可重名变量,类型推断,类型转换,别名类型和潜在类型 数组: 数组 ...
- 换个语言学一下 Golang (6)——数组,切片和字典
在上面的章节里面,我们讲过Go内置的基本数据类型.现在我们来看一下Go内置的高级数据类型,数组,切片和字典. 数组(Array) 数组是一个具有相同数据类型的元素组成的固定长度的有序集合.比如下面的例 ...
- Golang基础(3):数组,切片和字典
一:数组 数组是一个具有相同类型元素,固定长度的有序集合,一般定义如下:var x [5]int表示数组是一个整数型数组,长度为5数组的几种定义方式 a: var来定义数组,然后依次赋值 packag ...
- Golang 入门 : 切片(slice)
切片(slice)是 Golang 中一种比较特殊的数据结构,这种数据结构更便于使用和管理数据集合.切片是围绕动态数组的概念构建的,可以按需自动增长和缩小.切片的动态增长是通过内置函数 append( ...
- 转 Golang 入门 : 切片(slice)
https://www.jianshu.com/p/354fce23b4f0 切片(slice)是 Golang 中一种比较特殊的数据结构,这种数据结构更便于使用和管理数据集合.切片是围绕动态数组的概 ...
- golang之切片
1.切片:切片是数组的一个引用,因此切片是引用类型 2.切片的长度可以改变,因此,切片是个可变的数组. 3.切片遍历方式和数组一样,可以用len()求长度 4.cap可以求出slice最大的容量,0& ...
- vue数组进行分组
数组进行分组使用switch方法 <template> <v-layout> <v-card contextual-style="dark" v-if ...
- LeetCode随缘刷题之Java经典面试题将一个字符串数组进行分组输出,每组中的字符串都由相同的字符组成
今天给大家分享一个Java经典的面试题,题目是这样的: 本题是LeetCode题库中的49题. 将一个字符串数组进行分组输出,每组中的字符串都由相同的字符组成 举个例子:输入["eat&qu ...
- Golang字符串是否存在于切片或数组中的小工具(基本等同于python in语法)
// golang中是没有判断字符串是否存在数组或切片里的内置方法, 所以我们可以自己搞一个快速小组件 func Find(slice []string, val string) (int, bool ...
随机推荐
- APReLU:跨界应用,用于机器故障检测的自适应ReLU | IEEE TIE 2020
论文的工作属于深度学习在工业界的应用,借鉴计算机视觉的解决方法,针对机器故障检测的场景提出自适应的APReLU,对故障检测的准确率有很大的提升.论文整体思想应该也可以应用于计算机视觉,代码也开源了,大 ...
- KingbaseES V8R6 等待事件之IO类BufFileRead BufFileWrite
等待事件含义 当数据库创建临时文件时,会发生IO:BufFileRead和IO:BufFileWrite等待事件.当操作需要的内存比当前定义的work_mem内存参数更多时,会将临时数据写入磁盘永久存 ...
- C++中std::function常见用法
C++标准库中的std::function是一个通用的函数封装,可以用来存储.复制.调用任何可调用对象(函数.函数指针.成员函数指针.lambda表达式等).以下是std::function的一些常见 ...
- 世界疫情div界面搭建初步
1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="U ...
- #动态规划#CF889E Mod Mod Mod
题目传送门 分析 这道题有一个很妙的地方就是将一段前缀整体一起做. 设 \(dp[i][j]\) 表示\(x\) 被前 \(i\) 个数取模后答案最大,并且 \(j\) 为取得此答案的最大值 最后再对 ...
- JDK 14的新特性:switch表达式
目录 简介 写在前面 连写case switch返回值 yield 总结 简介 switch的新特性可是源远流长,早在JDK 12就以预览功能被引入了,最终在JDK 14成为了正式版本的功能:JEP ...
- MySQL学习路线一条龙
引言 在当前的IT行业,无论是校园招聘还是社会招聘,MySQL的重要性不言而喻. 面试过程中,MySQL相关的问题经常出现,这不仅因为它是最流行的关系型数据库之一,而且在日常的软件开发中,MySQL的 ...
- HMS Core机器学习服务,高效助力跨语种沟通
5月24日, HUAWEI Developer Day(简称HDD)线上沙龙·创新开发专场活动成功举办.HMS Core机器学习服务(ML Kit)产品经理在会上围绕机器翻译的技术优势.使用场景和接入 ...
- openGauss单机部署
openGauss 单机部署 一.安装环境 操作系统:虚拟机 VMware.CentOS7.9 环境设置: (1)虚拟机内存 3G.磁盘 100G (2)系统版本修改 一开始使用了 centos8,无 ...
- 批处理 if的知识点
正文 批处理的if不同于我们在一些常规语言中的if,比如说c或者c# 或者 java等. 如果我们判断两个字符是否相等,我们使用 'a'=='a' 来判断. 但是如果是不相等却不能这样. gtr 大于 ...