Java/Python/Go不同开发语言基础数据结构和相关操作总结-Map篇

Java/Python/Go不同开发语言基础数据结构和相关操作总结

  • 1. Java
      • 1.1 基础操作
        • 1.1.1 数据结构和定义方式
        • 1.1.2 增加
        • 1.1.3 修改
        • 1.1.4 查询
        • 1.1.5 删除
        • 1.1.6 获取总长度
        • 1.1.7 按key排序
        • 1.1.8 按value排序
        • 1.1.9 遍历
      • 1.2 常用其他方法
        • 1.2.1 几种数据结构的对比
  • 2. Go
      • 2.1基础操作
        • 2.1.1 数据结构和定义方式
        • 2.1.2 增加
        • 2.1.3 修改
        • 2.1.4 查询
        • 2.1.5 删除
        • 2.1.6 获取总长度
        • 2.1.7 按key排序
        • 2.1.8 按value排序
        • 1.1.9 遍历
  • 3. Python
    • 3.1 列表
      • 3.1.1 数据结构和定义方式
      • 3.1.2 增加
      • 3.1.3 修改
      • 3.1.4 查询
      • 3.1.5 删除
      • 3.1.6 获取总长度
      • 3.1.7 按key排序
      • 3.1.8 按value排序
      • 3.1.9 遍历

由于最近频繁在java、python、go三种开发语言中不断切换,有时候针对基础的数据结构和日常操作搞混了,因此本文进行相关梳理。文中涉及的相关数据结构和日常操作并不复杂,权当增强记忆和理解。


1. Java

Java 自带了各种 Map 类。这些 Map 类可归为三种类型:

  • 通用Map,用于在应用程序中管理映射,通常在 java.util 程序包中实现
    HashMap、Hashtable、Properties、LinkedHashMap、IdentityHashMap、TreeMap、WeakHashMap、ConcurrentHashMap

  • 专用Map,通常我们不必亲自创建此类Map,而是通过某些其他类对其进行访问
    java.util.jar.Attributes、javax.print.attribute.standard.PrinterStateReasons、java.security.Provider、java.awt.RenderingHints、javax.swing.UIDefaults

  • 一个用于帮助我们实现自己的Map类的抽象类
    AbstractMap

类型说明线程安全
HashMap最常用的Map,它根据键的HashCode 值存储数据,根据键可以直接获取它的值,具有很快的访问速度; HashMap最多只允许一条记录的键为Null(多条会覆盖); 允许多条记录的值为 Null线程不安全
TreeMap能够把它保存的记录根据键(key)排序,默认是按升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。TreeMap不允许key的值为null线程不安全
HashTable与 HashMap类似,不同的是:key和value的值均不允许为null; 它支持线程的同步,即任一时刻只有一个线程能写Hashtable,因此也导致了Hashtale在写入时会比较慢。线程安全
LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.在遍历的时候会比HashMap慢。key和value均允许为空线程不安全

其中HashMap是最常用的,其他类型的Map根据使用,本文重点介绍HashMap

1.1 基础操作

1.1.1 数据结构和定义方式
# 定义空
Map<String, String> map = new HashMap<>();# 初始化Map<String, String> map = new HashMap<String, String>() {{put("a", "b");put("b", "b");}};
1.1.2 增加
map.put(K key, V value);
map.put("key1", "value1");
1.1.3 修改
map.put(K key, V value);
map.put("key", "value");
1.1.4 查询
# 获取key的值
map.get(Object key);
map.get("key")
1.1.5 删除
map.remove(Object key);
map.remove("key");
1.1.6 获取总长度
# 获取总长度
int length = map.size();
1.1.7 按key排序

HashMap本身本身无序,如果需要排序,可以单独整理出key作为列表,然后形成排序,通过有序的key获取对应的value。

List<Map.Entry<String, String>> list = new ArrayList<>(map.entrySet());
list.sort(new Comparator<Map.Entry<String, String>>() {@Overridepublic int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) {return o1.getKey().compareTo(o2.getKey());}
});
1.1.8 按value排序
List<Map.Entry<String, String>> list = new ArrayList<>(map.entrySet());
list.sort(new Comparator<Map.Entry<String, String>>() {@Overridepublic int compare(Map.Entry<String, String> o1, Map.Entry<String, String> o2) {return o1.getValue().compareTo(o2.getValue());}
});
1.1.9 遍历
# 整体遍历
for (Map.Entry<String, String> mapping: map.entrySet()) {System.out.println(mapping.getKey() + ":" + mapping.getValue());
}

1.2 常用其他方法

1.2.1 几种数据结构的对比

在这里插入图片描述

2. Go

go没有定义复杂的数据结构,只有map一种类型,并且不设置容量,能够自动扩容。

2.1基础操作

2.1.1 数据结构和定义方式
# 定义空数据
m := make(map[string]int)
m := map[string]int{}# 创建一个初始容量为 10 的 Map
m := make(map[string]int, 10)# 初始化
m1 := map[string]int{"张三": 3,"李四": 4,"王五": 5,
};
2.1.2 增加
# 指定index后添加元素
m["key"]="value"
2.1.3 修改
# 指定index后添加元素
m["key"]="value"
2.1.4 查询
# 指定key后添加元素
var value = m["key"]
2.1.5 删除
# 指定key后删除元素
delete(m, "key")
2.1.6 获取总长度
# 获取list的总长度
var length = len(list)
2.1.7 按key排序

没有提供原生的方法,需要自己实现,将key生成切片,完成切片排序。可以参考Java/Python/Go不同开发语言基础数据结构和相关操作总结-数组篇

// 按照key排序
var keys []int
for k := range m {keys = append(keys, k)
}
sort.Ints(keys)for _, k := range keys {fmt.Println("Key:", k, "Value:", m[k])
}
2.1.8 按value排序

没有提供原生的方法,需要自己实现,将value生成切片,完成切片排序。可以参考Java/Python/Go不同开发语言基础数据结构和相关操作总结-数组篇

 mapInfo := map[string]int32{"roy":18,"kitty":16,"hugo":21,"tina":35,"jason":23,}type peroson struct {Name stringAge int32}// 生成切片var lstPerson []perosonfor k, v := range mapInfo {lstPerson = append(lstPerson, peroson {k, v})}// 切片排序sort.Slice(lstPerson, func(i, j int) bool {return lstPerson[i].Age < lstPerson[j].Age  // 升序})fmt.Println(lstPerson)
1.1.9 遍历
for key, value := range m {fmt.Printf("key=%s, value=%d\n", key, value)
}

3. Python

3.1 列表

声明不固定长度的列表,因此能够提供更加丰富的api和操作方法,也是最常用的数据结构。

3.1.1 数据结构和定义方式

# 定义空数据
m = { }# 初始化
m = {"key1" : "value1", "key2" : "value2" }

3.1.2 增加

# 指定key
m["key"]="value"
m.add({"key": "value"})

3.1.3 修改

# 指定key
m["key"]="value"
m.update({"key": "value"})

3.1.4 查询

# 指定key
m["key"]

3.1.5 删除

# 指定key
del m["key"]

3.1.6 获取总长度

len(m)

3.1.7 按key排序

# 按key排序
m1 = sorted(m)

3.1.8 按value排序

# 按value排序
m1 = sorted(m.items(), key = lambda kv:(kv[1], kv[0]))

3.1.9 遍历

for key, value in m.items():print(key, value)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/447966.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

从零开始,轻松打造Web自动化测试框架:Python+Selenium实战指南

在程序员的世界中&#xff0c;一切重复性的工作&#xff0c;都应该通过程序自动执行。「自动化测试」就是一个最好的例子。 随着互联网应用开发周期越来越短&#xff0c;迭代速度越来越快&#xff0c;只会点点点&#xff0c;不懂开发的手工测试&#xff0c;已经无法满足如今的…

【Vue】2-11、组件的生命周期

一、生命周期 & 声明周期函数 生命周期&#xff08;Life Cycle&#xff09;是值一个组件从 创建 -> 运行 -> 销毁 的整个阶段&#xff0c;强调的是一个时间段。 生命周期函数是由 Vue 框架提供的内置函数&#xff0c;会伴随着组件的生命周期&#xff0c;自动按次序…

Echars3D 饼图开发

关于vue echart3D 饼图开发 首先要先下载 "echarts-gl", 放在main.js npm install echarts-gl --save <template><div class"cointan"><!-- 3d环形图 --><div class"chart" id"cityGreenLand-charts"><…

C语言:详解操作符(上)

摘要&#xff1a; 本篇&#xff0c;我们将学习C语言中操作符的相关内容&#xff0c;操作符是C语言中重要的元素之一&#xff0c;在我们的代码中处处都有&#xff0c;下面我们将详细介绍操作符的相关内容&#xff0c;并结合一些代码例题加深印象。 目录 一、操作符的分类及介绍 …

Axure RP 网页版,让原型设计更高效

交互神器Axure RP是一种专业的快速原型设计工具&#xff0c;但Axure在用户体验上的缺陷也很明显。其设置交互方式相对繁琐&#xff0c;可视化不足、条件判断、变量、中继器等功能的使用需要陡峭的学习曲线。许多设计师正在寻找一个可以取代Axure的原型设计工具&#xff0c;即时…

图像去噪——SpatiallyAdaptiveSSID网络推理测试(详细图文教程)

SpatiallyAdaptiveSSID 是一种有效的图像去噪方法&#xff0c;它通过自适应地处理不同区域的噪声&#xff0c;能够在保持图像细节的同时&#xff0c;有效地去除噪声。 目录 一、SpatiallyAdaptiveSSID网络简介二、源码包准备2.1 测试集2.2 模型权重文件 三、测试环境四、推理测…

Spring框架——主流框架

文章目录 Spring(轻量级容器框架)Spring 学习的核心内容-一图胜千言IOC 控制反转 的开发模式Spring快速入门Spring容器剖析手动开发- 简单的 Spring 基于 XML 配置的程序课堂练习 Spring 管理 Bean-IOCSpring 配置/管理 bean 介绍Bean 管理包括两方面: Bean 配置方式基于 xml 文…

从零开始学Linux之gcc链接

目录 创建静态库并使用 创建动态库(共享库)并使用 链接&#xff1a;将.o目标文件链接起来生成一个可执行程序文件&#xff0c;可分为静态链接和动态链接 静态链接&#xff1a;链接器会找出程序所需的函数&#xff0c;然后将它们拷贝到执行文件&#xff0c;由于这种拷贝是完整…

双非本科准备秋招(14.1)—— 力扣刷题

今天做两个有点难度的题。 1、295. 数据流的中位数 手写堆实现&#xff1a; 加入元素&#xff1a; 如何维护一个中位数&#xff1f;我们考虑一下堆的特点&#xff0c;大顶堆堆顶是一个最大值&#xff0c;小顶堆堆顶是一个最小值&#xff0c;那么&#xff0c;如果我们可以把数…

路由重定向和别名

聚沙成塔每天进步一点点 本文内容 ⭐ 专栏简介1. 路由重定向实例场景&#xff1a;路由重定向的应用场景&#xff1a; 2. 路由别名实例场景&#xff1a;路由别名的应用场景&#xff1a; ⭐ 写在最后 ⭐ 专栏简介 Vue学习之旅的奇妙世界 欢迎大家来到 Vue 技能树参考资料专栏&…

【INTEL(ALTERA)】为什么 F-tile Serial Lite IV FPGA IP 设计示例会失败

说明 由于Intel Agilex 7 FPGA I 系列收发器-SoC 开发套件的时钟控制器 GUI 存在问题&#xff0c;当您需要配置芯片 Si5332 的 OUT1 时钟频率时&#xff0c;您可能会发现 F-tile Serial Lite IV 英特尔 FPGA IP设计示例失败。这是因为此 Si5332 GUI 存在问题;无法准确配置 OUT…

Python使用fastAPI实现一个流式传输接口

1. 使用fastapi实现流式传输 1.1 服务端 fastapi_server.py 编写服务端代码fastapi_server.py。服务端代码主要使用了fastapi和uvicorn两个库。 #!/usr/bin/env python # codingutf-8 # Time : 2024/1/31 19:13 # Software: PyCharm from fastapi import FastAPI from fa…