问题

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的更多相关文章

  1. Java8新特性之forEach+Lambda 表达式遍历Map和List

    这是Java8系列的第二篇,今天来说一下Java8中forEach的简单使用.我们使用对比的方式来看应该会看得更加清楚,更能理解: 一.遍历Map ============Java8之前的方式==== ...

  2. bboss oreach循环嵌套遍历map

    foreach循环嵌套遍历mapforeach嵌套dsl脚本定义 <property name="dynamicInnerDsl"> <![CDATA[{ ## ...

  3. 为什么for不能有序遍历数组的所有元素?(Array的设计原理)

    这个题目略微浅显,但却不易讲明白.如果我告诉你,我们不能以任何代码保证可以有序遍历出一个数组的所有元素,你肯定会反驳我,因为使用for明明就可以啊!但其实不是. 一.为什么FOR不能保证遍历所有? 代 ...

  4. php foreach 语法的遍历来源数组如果不是一个有效数组php会出现错误警告 Invalid argument supplied for foreach()

    在php中,foreach语法的遍历来源数组如果不是一个有效数组,php会出现错误警告 Invalid argument supplied for foreach() ,但是很多时候这个数组是取自某些 ...

  5. C# for和 foreach 的数组遍历 比较

    刚学习程序,感觉写代码 很有意思,所以把自己的感悟写下来啦,第一次写博客,可能是菜鸟中的菜鸟  时间久了,相信就会写的很好哦! for和 foreach 的数组遍历 比较 很简单的程序,不解释啦! u ...

  6. Java foreach操作(遍历)数组

    语法: 我们分别使用 for 和 foreach 语句来遍历数组 运行结果: 练习: import java.util.Arrays; public class HelloWorld { public ...

  7. 编写高质量代码改善C#程序的157个建议——建议17:多数情况下使用foreach进行循环遍历

    建议17:多数情况下使用foreach进行循环遍历 由于本建议涉及集合的遍历,所以在开始讲解本建议之前,我们不妨来设想一下如何对结合进行遍历.假设存在一个数组,其遍历模式可以采用依据索引来进行遍历的方 ...

  8. Java中forEach, 用来遍历数组

    这里的for是Java中forEach, 用来遍历数组的.for(int i : d) 就是遍历int型数组d的 每一次访问数组d的时候读取的数据放入int型的i中.和for(int i=0;i< ...

  9. jstl标签forEach的用法--遍历java的集合

    再讲<c:forEach>之前,现讲一下让EL表达式生效的语句 <% @ page isELIgnored="false"%>这句语句在你想让EL表达式生效 ...

随机推荐

  1. 【题解】[USACO07OPEN]Dining G

    \(Link\) \(\text{Solution:}\) 这一题,我们要做到,食物和牛.牛和饮料均为一对一的关系.我们发现这个图不好建立. 经典技巧:将牛拆边,拆成入点和出点,并连容量为\(1\)的 ...

  2. 正式班D5

    2020.10.10星期六 正式班D5 一.上节课复习 1.硬盘分类 ​ 1.机械磁盘 ​ io时间=平均寻道时间+平均延迟时间 ​ buffer:写缓冲区 ​ cache:都缓存 ​ 2.固态硬盘 ...

  3. Word云(标签云)生成器控件。net Windows。形式在c#中

    下载demo - 37.1 KB 下载source code - 48.7 KB 背景 这种控制方式的灵感来自于一种名为Wordle的基于网络的免费单词云生成器.实际上,这个控件是我的项目http:/ ...

  4. CAD& CG 2020 胡事民教授—开源框架Jittor的创新与探索

    题目:深度学习框架"计图"的创新与探索 报告人:胡事民 报告人简介:胡事民,清华大学计算机系教授,主要研究方向为计算机图形学.虚拟现实.智能信息处理和系统软件等. 报告简介:深度学 ...

  5. IDEA设置maven修改settings.xml配置文件无法加载仓库

    作为初学者配置maven一般网上搜索.然后你就看到各种配置文件片段,首先配置镜像,然后配置仓库.完事后再IDEA里面配置下maven的路径和配置文件路径. 这些文章属实坑爹,完全没讲一个重要的配置就是 ...

  6. 实验五 css进阶应用

    实验五 css进阶应用 实验目的: 掌握CSS在列表中的应用,能利用CSS将列表做成精美的导航栏: 掌握CSS在表单元素中的应用: 掌握SPRY菜单的制作方法和CSS代码修改. 实验内容: 1. 制作 ...

  7. day53 Pyhton 前端04

    内容回顾: 盒子: 内边距:padding,解决内部矛盾,内边距的增加整个盒子也会增加 外边距:margin,解决外部矛盾,当来盒子都有外边距的时候,取两者最大值 边框:border border-c ...

  8. centos8平台使用iotop监控磁盘io

    一,iotop的作用: iotop是监视磁盘I/O使用状况的top类工具, 可以针对进程和线程统计io的使用情况 说明:刘宏缔的架构森林是一个专注架构的博客,地址:https://www.cnblog ...

  9. php进程 swoole

    <?php $pid = posix_getpid(); $ppid = posix_getppid(); var_dump($pid); cli_set_process_title(" ...

  10. 白话k8s-Pod的组成

    k8s的所有功能都是围绕着Pod进行展开的,我们经常会看到类似这样一张图 告诉我们,Pod是一组container的集合,container之间可以通过localhost:port的方式直接访问. 感 ...