原理图
通过维护一条链表,解决了 HashMap 不能随时保持遍历顺序和插入顺序一致的问题。根据经验而言单向链表足以无须双向链表,绝大部分场景根本不需要反向查询,所以我们只需要能保证,按照插入的顺序进行迭代即可
要求
自己需要准备一套HashMap的数据结构(数组+链表+红黑树) ,没有的可以自己在我博客里学习 ,当然(数组+链表的HashMap也可以)
代码
#ifndef STUDY_CHARLINKEDHASHMAP_H
#define STUDY_CHARLINKEDHASHMAP_H
#include "charkvlinked.h"
#include "charhashmap.h"
typedef struct charLinkedHashMap{
CharHashMap *charHashMap;
struct CharKvLinked *charKvLinked; //单向链表,来维护hash插入的顺序,主要是为了能按照顺序迭代元素
} CharLinkedHashMap;
CharLinkedHashMap *createCharLinkedHashMap(int size);
void putCharLinkedHashMap(CharLinkedHashMap *charLinkedHash, char *key, void *value);
void *getCharLinkedHashMap(CharLinkedHashMap *charLinkedHash, char *key);
void removeCharLinkedHashMap(CharLinkedHashMap *charLinkedHash, char *key);
void updateCharLinkedHashMap(CharLinkedHashMap *charLinkedHash, char *key, void *value);
int sizeCharLinkedHashMap(CharLinkedHashMap *charLinkedHash);
boolean containsKeyCharLinkedHashMap(CharLinkedHashMap *charLinkedHash, char *key);
// 迭代器结构
typedef struct charLinkedHashIterator {
CharKvLinkedIterator *charKvLinkedIterator; // 链表的迭代器
} CharLinkedHashIterator;
// 创建哈希结构迭代器
CharLinkedHashIterator *createCharLinkedHashMapIterator(CharLinkedHashMap *charLinkedHash);
// 迭代器是否有下一个
boolean hasNextCharLinkedHashMapIterator(CharLinkedHashIterator *iterator) ;
// 迭代到下一次
CharKvLinkedNode *nextCharLinkedHashMapIterator(CharLinkedHashIterator *iterator);
CharLinkedHashMap *copyCharLinkedHashMap(CharLinkedHashMap *charLinkedHash);
void mergeCharLinkedHashMap(CharLinkedHashMap *charLinkedHash1, CharLinkedHashMap *charLinkedHash2);
CharLinkedHashMap *mergeCharLinkedHashMapNewMap(CharLinkedHashMap *linkedHashMap1, CharLinkedHashMap *linkedHashMap12);
CharLinkedHashMap *differenceCharLinkedHashMap(CharLinkedHashMap *linkedHashMap1, CharLinkedHashMap *linkedHashMap2);
CharLinkedHashMap *intersectionCharLinkedHashMap(CharLinkedHashMap *linkedHashMap1, CharLinkedHashMap *linkedHashMap2);
CharLinkedHashMap *complementCharLinkedHashMap(CharLinkedHashMap *linkedHashMap1, CharLinkedHashMap *linkedHashMap2);
CharLinkedHashMap *unionCharLinkedHashMap(CharLinkedHashMap *linkedHashMap1, CharLinkedHashMap *linkedHashMap2);
void clearCharLinkedHashMap(CharLinkedHashMap *linkedHashMap);
#endif //STUDY_CHARLINKEDHASHMAP_H
#include "charlinkedhashmap.h"
#include <stdlib.h>
//创建一个map
CharLinkedHashMap *createCharLinkedHashMap(int size) {
CharLinkedHashMap *charLinkedHash = (CharLinkedHashMap *) malloc(sizeof(CharLinkedHashMap));
charLinkedHash->charHashMap = createCharHashMap(size);
charLinkedHash->charKvLinked = createCharKvLinked();
return charLinkedHash;
}
//添加一个元素
void putCharLinkedHashMap(CharLinkedHashMap *charLinkedHash, char *key, void *value) {
putCharHashMap(charLinkedHash->charHashMap, key, value);
insertCharKvLinkedEndNode(charLinkedHash->charKvLinked, createCharKvLinkedNode(key, value));
}
//获取一个元素
void *getCharLinkedHashMap(CharLinkedHashMap *charLinkedHash, char *key) {
return getCharHashMap(charLinkedHash->charHashMap, key);
}
//删除一个元素
void removeCharLinkedHashMap(CharLinkedHashMap *charLinkedHash, char *key) {
removeCharHashMap(charLinkedHash->charHashMap, key);
delCharKvLinkedNode(charLinkedHash->charKvLinked, key);
}
//更新一个元素
void updateCharLinkedHashMap(CharLinkedHashMap *charLinkedHash, char *key, void *value) {
updateCharHashMap(charLinkedHash->charHashMap, key, value);
updateCharKvLinkedNode(charLinkedHash->charKvLinked, key, value);
}
//获取map的大小
int sizeCharLinkedHashMap(CharLinkedHashMap *charLinkedHash) {
return sizeCharHashMap(charLinkedHash->charHashMap);
}
//判断是否包含key
boolean containsKeyCharLinkedHashMap(CharLinkedHashMap *charLinkedHash, char *key) {
return containsKeyCharHashMap(charLinkedHash->charHashMap, key);
}
//创建一个迭代器
CharLinkedHashIterator *createCharLinkedHashMapIterator(CharLinkedHashMap *charLinkedHash) {
CharLinkedHashIterator *charLinkedHashIterator = (CharLinkedHashIterator *) malloc(sizeof(CharLinkedHashIterator));
CharKvLinkedIterator *pIterator = createCharKvLinkedIterator(charLinkedHash->charKvLinked);
charLinkedHashIterator->charKvLinkedIterator = pIterator;
return charLinkedHashIterator;
}
//迭代器是否有下一个
boolean hasNextCharLinkedHashMapIterator(CharLinkedHashIterator *iterator) {
return hasNextCharKvLinkedIterator(iterator->charKvLinkedIterator);
}
//迭代到下一次
CharKvLinkedNode *nextCharLinkedHashMapIterator(CharLinkedHashIterator *iterator) {
return nextCharKvLinkedIterator(iterator->charKvLinkedIterator);
}
//复制一个map
CharLinkedHashMap *copyCharLinkedHashMap(CharLinkedHashMap *charLinkedHash) {
CharLinkedHashMap *copyCharLinkedHash = createCharLinkedHashMap(charLinkedHash->charHashMap->size);
CharKvLinkedNode *pNode = charLinkedHash->charKvLinked->head;
while (pNode != NULL) {
putCharLinkedHashMap(copyCharLinkedHash, pNode->key, pNode->value);
pNode = pNode->next;
}
return copyCharLinkedHash;
}
//将一个map集合,合并到另一个map集合里 charLinkedHash2合并到charLinkedHash1
void mergeCharLinkedHashMap(CharLinkedHashMap *charLinkedHash1, CharLinkedHashMap *charLinkedHash2) {
CharKvLinkedNode *pNode = charLinkedHash2->charKvLinked->head;
while (pNode != NULL) {
putCharLinkedHashMap(charLinkedHash1, pNode->key, pNode->value);
pNode = pNode->next;
}
}
//合并两个Map集合,返回一个新的Map集合
CharLinkedHashMap *mergeCharLinkedHashMapNewMap(CharLinkedHashMap *linkedHashMap1, CharLinkedHashMap *linkedHashMap12) {
CharLinkedHashMap *pHashMap = createCharLinkedHashMap(sizeCharLinkedHashMap(linkedHashMap1) + sizeCharLinkedHashMap(linkedHashMap12) );
CharLinkedHashIterator *pIterator1 = createCharLinkedHashMapIterator(linkedHashMap1);
while (hasNextCharLinkedHashMapIterator(pIterator1)) {
CharKvLinkedNode *entry = nextCharLinkedHashMapIterator(pIterator1);
putCharLinkedHashMap(pHashMap, entry->key, entry->value);
}
CharLinkedHashIterator *pIterator2 = createCharLinkedHashMapIterator(linkedHashMap12);
while (hasNextCharLinkedHashMapIterator(pIterator2)) {
CharKvLinkedNode *entry = nextCharLinkedHashMapIterator(pIterator2);
putCharLinkedHashMap(pHashMap, entry->key, entry->value);
}
return pHashMap;
}
//差集,返回一个新的Map集合,返回hashMap2的差集
CharLinkedHashMap *differenceCharLinkedHashMap(CharLinkedHashMap *linkedHashMap1, CharLinkedHashMap *linkedHashMap2) {
CharLinkedHashMap *pHashMap = createCharLinkedHashMap(sizeCharLinkedHashMap(linkedHashMap1) );
CharLinkedHashIterator *pIterator1 = createCharLinkedHashMapIterator(linkedHashMap1);
while (hasNextCharLinkedHashMapIterator(pIterator1)) {
CharKvLinkedNode *entry = nextCharLinkedHashMapIterator(pIterator1);
if (!containsKeyCharLinkedHashMap(linkedHashMap2, entry->key)) {
putCharLinkedHashMap(pHashMap, entry->key, entry->value);
}
}
return pHashMap;
}
//交集,返回一个新的Map集合
CharLinkedHashMap *intersectionCharLinkedHashMap(CharLinkedHashMap *linkedHashMap1, CharLinkedHashMap *linkedHashMap2) {
CharLinkedHashMap *pHashMap = createCharLinkedHashMap(sizeCharLinkedHashMap(linkedHashMap1) );
CharLinkedHashIterator *pIterator1 = createCharLinkedHashMapIterator(linkedHashMap1);
while (hasNextCharLinkedHashMapIterator(pIterator1)) {
CharKvLinkedNode *entry = nextCharLinkedHashMapIterator(pIterator1);
if (containsKeyCharLinkedHashMap(linkedHashMap2, entry->key)) {
putCharLinkedHashMap(pHashMap, entry->key, entry->value);
}
}
return pHashMap;
}
//补集,返回一个新的Map集合
CharLinkedHashMap *complementCharLinkedHashMap(CharLinkedHashMap *linkedHashMap1, CharLinkedHashMap *linkedHashMap2) {
CharLinkedHashMap *pHashMap = createCharLinkedHashMap(sizeCharLinkedHashMap(linkedHashMap1) );
CharLinkedHashIterator *pIterator1 = createCharLinkedHashMapIterator(linkedHashMap1);
while (hasNextCharLinkedHashMapIterator(pIterator1)) {
CharKvLinkedNode *entry = nextCharLinkedHashMapIterator(pIterator1);
if (!containsKeyCharLinkedHashMap(linkedHashMap2, entry->key)) {
putCharLinkedHashMap(pHashMap, entry->key, entry->value);
}
}
CharLinkedHashIterator *pIterator2 = createCharLinkedHashMapIterator(linkedHashMap2);
while (hasNextCharLinkedHashMapIterator(pIterator2)) {
CharKvLinkedNode *entry = nextCharLinkedHashMapIterator(pIterator2);
if (!containsKeyCharLinkedHashMap(linkedHashMap1, entry->key)) {
putCharLinkedHashMap(pHashMap, entry->key, entry->value);
}
}
return pHashMap;
}
//并集,返回一个新的Map集合 (如果有相同的key,则取linkedHashMap2的值)
CharLinkedHashMap *unionCharLinkedHashMap(CharLinkedHashMap *linkedHashMap1, CharLinkedHashMap *linkedHashMap2) {
CharLinkedHashMap *pHashMap = createCharLinkedHashMap(sizeCharLinkedHashMap(linkedHashMap1) + sizeCharLinkedHashMap(linkedHashMap2) );
CharLinkedHashIterator *pIterator1 = createCharLinkedHashMapIterator(linkedHashMap1);
while (hasNextCharLinkedHashMapIterator(pIterator1)) {
CharKvLinkedNode *entry = nextCharLinkedHashMapIterator(pIterator1);
putCharLinkedHashMap(pHashMap, entry->key, entry->value);
}
CharLinkedHashIterator *pIterator2 = createCharLinkedHashMapIterator(linkedHashMap2);
while (hasNextCharLinkedHashMapIterator(pIterator2)) {
CharKvLinkedNode *entry = nextCharLinkedHashMapIterator(pIterator2);
putCharLinkedHashMap(pHashMap, entry->key, entry->value);
}
return pHashMap;
}
//清除map
void clearCharLinkedHashMap(CharLinkedHashMap *linkedHashMap) {
charHashMapClear(linkedHashMap->charHashMap);
destroyCharKvLinked(linkedHashMap->charKvLinked);
free(linkedHashMap);
}