Go语言如何像foreach一样有序遍历map
问题
Go语言的Map是无序遍历的,遍历一个map代码如下
package main
import (
"fmt"
)
func main() {
m := map[string]int{"Apple": 20, "Tomato": 12, "Banana": 18}
for k, v := range m {
fmt.Println(k, v)
}
}
我们来运行3次
可以看到每次都是随机的,如何给一个map进行排序,并根据我们的的key进行遍历呢?
比如我们要跟据字典顺序来输出map的内容,怎么办?
解决
给key排序思路
其实我们可以借助一个slice来保存map的key,通过遍历排序后的slice来达到根据keys遍历map的效果
package main
import (
"fmt"
"sort"
)
func main() {
m := map[string]int{"Apple": 20, "Tomato": 12, "Banana": 18}
//给key排序一下
keys := make([]string, 0, len(m))
for k := range m {
keys = append(keys, k)
}
sort.Strings(keys)
//再次遍历
for _, k := range keys {
fmt.Println(k, m[k])
}
}
再次运行如下,可以看到结果都是一致的
现在这个虽然可以达到给key排序,但是有一个弊端,就是不能像php中的foreach一样有序的遍历
比如如下的php中的foreach代码,永远是按照添加的顺序输出的
<?php
$map = [
"a" => 1,
"b" => 2,
"d" => 3,
"c" => 4,
];
foreach ($map as $k => $v) {
echo "{$k}={$v}" . PHP_EOL;
}
运行结果如下
开源实现
我们知道上面的永远会根据a,b,c,d这样keys的顺序来输出,不满足我们的要求。
好在已经有人实现了有序Map,下载地址:这是一个链接 elliotchance/orderedmap
我们来使用一下
package main
import (
"fmt"
"github.com/elliotchance/orderedmap"
)
func main() {
//新建一个order map
m := orderedmap.NewOrderedMap()
m.Set("a", 1)
m.Set("b", 2)
m.Set("d", 3)
m.Set("c", 4)
//遍历一下
for _, key := range m.Keys() {
value, _ := m.Get(key)
fmt.Printf("%v=%v\n", key, value)
}
}
运行结果如下
这个包可以让我们像php的foreach一样high起来,真的是绝了!
Go语言如何像foreach一样有序遍历map的更多相关文章
- Java8新特性之forEach+Lambda 表达式遍历Map和List
这是Java8系列的第二篇,今天来说一下Java8中forEach的简单使用.我们使用对比的方式来看应该会看得更加清楚,更能理解: 一.遍历Map ============Java8之前的方式==== ...
- bboss oreach循环嵌套遍历map
foreach循环嵌套遍历mapforeach嵌套dsl脚本定义 <property name="dynamicInnerDsl"> <![CDATA[{ ## ...
- 为什么for不能有序遍历数组的所有元素?(Array的设计原理)
这个题目略微浅显,但却不易讲明白.如果我告诉你,我们不能以任何代码保证可以有序遍历出一个数组的所有元素,你肯定会反驳我,因为使用for明明就可以啊!但其实不是. 一.为什么FOR不能保证遍历所有? 代 ...
- php foreach 语法的遍历来源数组如果不是一个有效数组php会出现错误警告 Invalid argument supplied for foreach()
在php中,foreach语法的遍历来源数组如果不是一个有效数组,php会出现错误警告 Invalid argument supplied for foreach() ,但是很多时候这个数组是取自某些 ...
- C# for和 foreach 的数组遍历 比较
刚学习程序,感觉写代码 很有意思,所以把自己的感悟写下来啦,第一次写博客,可能是菜鸟中的菜鸟 时间久了,相信就会写的很好哦! for和 foreach 的数组遍历 比较 很简单的程序,不解释啦! u ...
- Java foreach操作(遍历)数组
语法: 我们分别使用 for 和 foreach 语句来遍历数组 运行结果: 练习: import java.util.Arrays; public class HelloWorld { public ...
- 编写高质量代码改善C#程序的157个建议——建议17:多数情况下使用foreach进行循环遍历
建议17:多数情况下使用foreach进行循环遍历 由于本建议涉及集合的遍历,所以在开始讲解本建议之前,我们不妨来设想一下如何对结合进行遍历.假设存在一个数组,其遍历模式可以采用依据索引来进行遍历的方 ...
- Java中forEach, 用来遍历数组
这里的for是Java中forEach, 用来遍历数组的.for(int i : d) 就是遍历int型数组d的 每一次访问数组d的时候读取的数据放入int型的i中.和for(int i=0;i< ...
- jstl标签forEach的用法--遍历java的集合
再讲<c:forEach>之前,现讲一下让EL表达式生效的语句 <% @ page isELIgnored="false"%>这句语句在你想让EL表达式生效 ...
随机推荐
- 【题解】[USACO07NOV]Sunscreen G
\(Link\) \(\text{Solution:}\) 把奶牛的忍耐度转化为线段,则题目转化为选择一些点使得覆盖的线段尽可能多.一个点只能覆盖一条线段. 考虑将点按照位置排序,线段按照右端点排序. ...
- linux下的echo
echo命令用于在shell中打印shell变量的值,或者直接输出指定的字符串.linux的echo命令,在shell编程中极为常用, 在终端下打印变量value的时候也是常常用到的,因此有必要了解下 ...
- 利用github创建个人网站
先建个仓库,仓库名为: 用户名.github.io 进入仓库,删除README.md文件 新建个文件,文件名为: index.html,内容根据自己要求编写 打开网站,地址:https://用户名.g ...
- 【学习笔记】扩展卢卡斯定理 exLucas
引子 求 \[C_n^m\ \text{mod}\ p \] 不保证 \(p\) 是质数. 正文 对于传统的 Lucas 定理,必须要求 \(p\) 是质数才行.若 \(p\) 不一定是质数,则需要扩 ...
- 灵魂拷问:你真的理解System.out.println()执行原理吗?
原创/朱季谦 灵魂拷问,这位独秀同学,你会这道题吗? 请说说,"System.out.println()"原理...... 这应该是刚开始学习Java时用到最多一段代码,迄今为止 ...
- Solr6.4.2异常:org.apache.solr.common.SolrException: Error opening new searcher
版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明. 原文链接:https://www.cnblogs.com/chenghu/p/13840021.html Solr版本6.4.2 启动S ...
- 第二十章 nginx常见问题
一.Nginx常见问题 一.nginx多server优先级 在开始处理一个http请求时,nginx会取出header头中的Host变量,与nginx.conf中的每个server_name进行匹配, ...
- Cypress系列(68)- request() 命令详解
如果想从头学起Cypress,可以看下面的系列文章哦 https://www.cnblogs.com/poloyy/category/1768839.html 作用 发起一个 HTTP 请求 语法格式 ...
- mac 搭建 Robot Framework
前提介绍,我的mac上python2和python3是都要有的,然后大家可以看看我其他的文章,这些文章虽然很多都是连接,是别人的博客或者资料,但都是自己试过没有问题的,只是比较懒然后就没有自己写. r ...
- volatile与重排序
使用关键字volatile可以禁止代码的重排序: 在Java程序运行时,JIT(即使编译器)可以动态地改变程序代码运行地顺序:例如,有如下代码: A代码-重耗时 B代码-轻耗时 C代码-重耗时 D代码 ...