一 目的
在编写程序时,本人使用第二多的数据结构是键值对,通过唯一的key来索引一个可以更加“精密”数据结构。总结来说,在我的产品中,应用较多的两个场景分别是:
- 通过key-value返回context,例如使用django、spring boot等框架编写后端;
- 存储大量的结构化信息,通过唯一的key索引,快速访问。
各种编程语言都有实现key-value数据结构,现在介绍如下。
二 创建key-value
创建空的key-values,可在后续的代码逻辑中插入数据。一般用于读取外部的数据。
Python实现:
#coding=utf8
from __future__ import print_function, division
from typing import Dict
d1 = {} # type: Dict[unicode, int] # 创建一个空的字典,key类型为unicode,value为int。
kotlin实现:
val m = mapOf<String, Int>() // 空不可变空map,因为没有初始化值,所以用处不大。
val mm = mutableMapOf<String, Int>() //可增删改查的mutable map,初始化为空。
Golang实现
var m = make(map[string]int) // 创建空的map,size为0。
//或者
m := map[string]int{}
C++实现:
map<string, int> m;
创建带有初始化列表的key-values。一般用于后端向前端返回context或者简单的demo。
Python实现:
d2 = {u'甲': 1, u'乙':2} # type: Dict[unicode, int] # 创建带有初始化键值对的字典
Kotlin实现:
val m2 = mapOf("甲" to 1, "乙" to 2) //值初始化之后,不可增删改查。
val mm2 = mutableMapOf("甲" to 1, "乙" to 2) // 值初始化之后,后续可根据情况增删改查。
Golang实现:
var m2 = map[string]int{
"甲": 1,
"乙": 2,
}
C++实现:
map<string, int> m2 = { // cpp11
{"甲", 1},
{"乙", 2}
};
三 插入新的key-value值
Python实现:
keys = [u'丙', u'丁']
for k in keys:
d2[k] = 3 # 插入新值,如果存在则覆盖,如果不存在则创建
Kotlin实现
val keys = listOf("丙", "丁")
for (key in keys) { // 依次插入一个
mm2[key] = 3
}
// 或者依次插入全部的pairs
mm2.putAll(listOf(Pair("丙",3 ), Pair("丁", 4)))
Golang实现
var keys = []string{"丙", "丁"}
for i := range keys {
m2[keys[i]] = 3 // 如果不存在key,则会闯进新的key,否则会将之前的value覆盖。
}
C++实现:
vector<string> keys{"丙", "丁"};
for(auto key : keys) {
m2[key] = 3; // 如果存在key,则覆盖之前的值,否则创建新的key,插入value。
}
// 或者
m2.insert(make_pair("戊", 5)); // 如果不存在key,则创建新的key,插入value,否则什么也不做。
四 删除key-value
Python代码,删除指定key:
del d2[u'甲']
# 或者
a = d2.pop(u'乙') # a为key对应的value。
如果不存在,则会抛出KeyError异常。
Kotlin代码,删除指定key:
mm2.remove("甲") // 删除key,如果key不存在,则什么也不影响。
Golang代码,删除指定key:
delete(m2, "丙") //如果key不存在什么都不做
C++代码,删除指定的key:
m2.erase("甲"); //如果key不存在什么都不做
Python代码,清空所有:
d2.clear()
Kotlin代码,清空所有:
mm2.clear()
Golang代码,清空所有:
for k := range m2 {
delete(m2, k)
}
// 或者
m2 = make([string]int) // 垃圾回收会清除之前的所有数据。
C++代码,清空所有:
m2.clear();
五 赋值
Python代码:
d2[u'戊'] = 5 # 如果存在key则会更新其值,不存在则创建新的,并赋值。
Kotlin代码:
mm2[u'戊'] = 5 # 如果存在key则会更新其值,不存在则创建新的,并赋值。
Golang代码:
m2["戊"] = 5 // 如果存在key则会更新其值,不存在则创建新的,并赋值。
C++代码:
m2["戊"] = 3; // 如果存在key,则覆盖之前的值,否则创建新的key,插入value。
// 或者
m2.insert(make_pair("戊", 5)); // 如果不存在key,则创建新的key,插入value,否则什么也不做。
六 访问
Python代码:
v = d2[u'甲'] # 如果key不存在,则会抛出KeyError异常。
Kotlin代码:
val v = mm2["甲"] // 如果key存在,则返回对应的value,否则返回null。
Golang
var v = m2["乙"] // 如果key存在,则返回对应的value,否则返回类型的默认值
C++代码:
m2["甲"] // 如果key存在,则返回对应的value,否则返回类型的默认值
七 判断是否存在key
Python代码:
d2.has_key(u'甲')
#或者
if u'甲' in d2:
print(d2[u'甲'])
if u'甲' not in d2:
d2[u'甲'] = 1
Kotlin代码:
mm2.contains("甲") //是否存在key
mm2.containsKey("甲") // 是否存在key
mm2.containsValue(1) // 是否存在value
Golang代码:
i, ok := m2["甲"]
_, ok := m2["甲"] // ok==true, 存在,否则不存在
C++代码:
map<string, int>::iterator fiter = m2.find("加");
if(fiter != m2.end()) {
cout <<"find it!" << endl;
} else {
cout << "find not!"<< endl;
}