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

news2024/11/20 3:27:10

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>>() {
    @Override
    public 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>>() {
    @Override
    public 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 string
     Age int32
 }

 // 生成切片
 var lstPerson []peroson
 for 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.coloradmin.cn/o/1428034.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录算法训练营第二十四天| 77. 组合。

77. 组合 题目链接&#xff1a;组合 题目描述&#xff1a; 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 解题思路&#xff1a; 本题是经典的回溯法解决的组合问题&#xff0c;回溯问题搞清楚纵向递归横向遍历即…

Redis核心技术与实战【学习笔记】 - 12.Redis删除数据后,为什么内存占用率还是很高?

前言 在使用 Redis 是&#xff0c;经常会遇到一个问题&#xff1a;明明做了数据删除&#xff0c;数据量不大&#xff0c;但是 使用 top 命令查看时&#xff0c;发现 Redis 还是占用了很多内存。 这是因为&#xff0c;当删除数据后&#xff0c;Redis 释放的内存空间会由内存分…

Vivado编译介绍

Vivado编译介绍 合成是将寄存器传输级别&#xff08;RTL&#xff09;指定的设计转换为门级表示。AMD Vivado™ 合成是定时驱动的&#xff0c;并针对内存进行优化使用和性能。Vivado合成支持以下的可合成子集&#xff1a; •SystemVerilog&#xff1a;IEEE标准SystemVerilog统…

UniMSE: Towards Unified Multimodal Sentiment Analysis and Emotion Recognition

文章目录 UniMSE&#xff1a;实现统一的多模态情感分析和情绪识别文章信息研究目的研究内容研究方法1.总体架构2.Task Formalization3.Pre-trained Modality Fusion (PMF)4.Inter-modality Contrastive Learning5.总体损失函数6.Decoding Algorithm 结果与讨论代码和数据集符号…

博客网站系统测试报告

一、项目背景 博客网站系统采用前后端分离的方法来实现&#xff0c;同时使用了数据库来存储相关的数据&#xff0c;同时将其部署到云服务器上。前端主要有个页面构成&#xff1a;注册页、登录页、个人博客列表页、博客详情页、编辑博客页、修改博客页以及博客系统主页&#xf…

【项目实践02】【优先级阻塞队列】

文章目录 一、前言二、项目背景三、实现方案四、思路延伸1. 优先级队列1.1 concurrent 包下的 PriorityBlockingQueue1.2 Redisson 的优先级阻塞队列 2. jvisualvm 远程连接3. Jstack 高 CPU 排查 五、参考内容 一、前言 本系列用来记录一些在实际项目中的小东西&#xff0c;并…

【算法分析与设计】交换两个节点

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;算法分析与设计 ⛺️稳中求进&#xff0c;晒太阳 题目 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本…

实习日志11

1.文件上传报错 1.1.报错信息Invalid typed array length: -2 1.2.查看源码找出错误 定位到检查代码上传是否成功的代码出错&#xff0c;rDataArr[3] 0x03 var pData new Uint8Array(pDataLen);的pDataLen4 说明rDataArr只有0-3&#xff0c;其他数据都没有上传上来 说明…

DoubleEnsemble:基于样本重加权和特征选择的金融数据分析方法

现代机器学习模型&#xff08;如深度神经网络和梯度提升决策树&#xff09;由于其提取复杂非线性模式的优越能力&#xff0c;在金融市场预测中越来越受欢迎。然而&#xff0c;由于金融数据集的信噪比非常低&#xff0c;并且是非平稳的&#xff0c;复杂的模型往往很容易过拟合。…

leetcode189.轮转数组|超简单易于理解方法

题目 https://leetcode.cn/problems/rotate-array/description/https://leetcode.cn/problems/rotate-array/description/ 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输…

基于uniapp+vue酒店宾馆客房民宿管理系统设计 微信小程序_54ybz

APP性能需求 &#xff08;1&#xff09;顾客在安卓APP页面各种操作可及时得到反馈。 &#xff08;2&#xff09;该平台是提供给多个用户使用的平台&#xff0c;用户使用之前需要注册登录。登录验证后&#xff0c;用户才可进行各种操作[10]。 &#xff08;3&#xff09;管理员、…

Java 集合 04 综合练习-查找用户是否存在

练习、 代码&#xff1a; public class User{private String id;private String username;private int password;public User() {}public User(String id, String username, int password) {this.id id;this.username username;this.password password;}public String getI…

舟山长寿医学中心:引领生命科技前沿

在浩瀚的东海之滨&#xff0c;舟山群岛如一颗璀璨的明珠&#xff0c;镶嵌在碧波荡漾的大海之中。这里不仅拥有得天独厚的自然美景&#xff0c;更是一块充满生机与活力的健康宝地。舟山长寿医学中心&#xff0c;正是这片神奇的土地上的一颗璀璨明珠&#xff0c;致力于为全球人士…

Linux权限【上篇】

&#x1f4d9; 作者简介 &#xff1a;RO-BERRY &#x1f4d7; 学习方向&#xff1a;致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f4d2; 日后方向 : 偏向于CPP开发以及大数据方向&#xff0c;欢迎各位关注&#xff0c;谢谢各位的支持 目录 扩展知识&#xff1a…

react 之 UseReducer

UseReducer作用: 让 React 管理多个相对关联的状态数据 import { useReducer } from react// 1. 定义reducer函数&#xff0c;根据不同的action返回不同的新状态 function reducer(state, action) {switch (action.type) {case INC:return state 1case DEC:return state - 1de…

系统移植--无法启动Linux内核--报错VFS--挂载nfs失败

问题 找信息&#xff1a;VFS 可能的原因 1、开发板上内核启动参数中的虚拟机ubuntu IP和真实的 虚拟机的IP不一致 2、开发板上内核启动参数中虚拟机的共享目录和虚拟机 ubuntu上配置的nfs服务器上的共享目录不一致 3、nfs配置文件(/etc/exports)路径错误 与自己的共享文件…

Galah:一款功能强大的LLM驱动型OpenAI Web蜜罐系统

关于Galah Galah是一款功能强大的Web蜜罐&#xff0c;该工具由LLM大语言模型驱动&#xff0c;基于OpenAI API实现其功能。 很多传统的蜜罐系统会模拟一种包含了大量网络应用程序的网络系统&#xff0c;但这种方法非常繁琐&#xff0c;而且有其固有的局限性。Galah则不同&…

Transformer 自然语言处理(四)

原文&#xff1a;Natural Language Processing with Transformers 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第十章&#xff1a;从头开始训练变换器 在本书的开头段落中&#xff0c;我们提到了一个名为 GitHub Copilot 的复杂应用&#xff0c;它使用类似 GPT 的…

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

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

当无法在Windows 10上更改分辨率时怎么办?这里提供几个方法

一般来说,如果你愿意,你可以很容易地更改Windows 10计算机的屏幕分辨率。如果你发现无法在Windows 10中更改分辨率,可以查看下面的解决方案来解决此问题。 无法在Windows 10上更改分辨率? 要在Windows 10上检查和更改屏幕分辨率,通常有两种简单的方法。 方法一:你可以…