网站首页 > 技术文章 正文
经常遇到的一个场景,将map放进list中,同时又会经常频繁操作这个list里的map,鉴于这种情况,就偷懒写了个MapList,里面都是些自己常用的方法,来个抛砖引玉,让大家指导下,还有什么可以改进下,又或者有什么方法可以替代这种方式。
以下就是代码:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MapList<K, V> extends ArrayList<Map<K, V>> {
private final int DEFAULT_CAPACITY = 16;
/**
* 键类型class
*/
private final Class<K> keyClass;
/**
* 值类型class
*/
private final Class<V> valueClass;
private MapList(Class<K> keyClass, Class<V> valueClass){
this.keyClass = keyClass;
this.valueClass = valueClass;
}
/**
* 新建键值对集合
* @param keyClass 键类型class
* @param valueClass 值类型class
* @param <K> 键类型
* @param <V> 值类型
* @return 键值对Map集合
*/
public static <K,V> MapList<K, V> newMapList(Class<K> keyClass, Class<V> valueClass){
return new MapList<>(keyClass, valueClass);
}
/**
* 新建键值对集合
* @param maps 键值对容器数组
* @param keyClass 键类型class
* @param valueClass 值类型class
* @param <K> 键类型
* @param <V> 值类型
* @return 键值对Map集合
*/
public static <K,V> MapList<K, V> newMapList(Map<K, V>[] maps, Class<K> keyClass, Class<V> valueClass){
List<Map<K, V>> list = Arrays.asList(maps);
return newMapList(list, keyClass, valueClass);
}
/**
* 新建键值对集合
* @param keyClass 键类型class
* @param valueClass 值类型class
* @param list 键值对Map集合
* @param <K> 键类型
* @param <V> 值类型
* @return 键值对Map集合
*/
public static <K,V> MapList<K, V> newMapList(List<Map<K, V>> list, Class<K> keyClass, Class<V> valueClass){
MapList<K, V> mapList = new MapList<>(keyClass, valueClass);
mapList.addAll(list);
return mapList;
}
/**
* 获取最后一个Map的值
* @param key 键
* @return 值
*/
public V get(K key){
return getLastMap().get(key);
}
/**
* 获取指定Map的值
* @param index 下标
* @param key 键
* @return 值
*/
public V get(int index, K key){
return get(index).get(key);
}
/**
* 新增多个键值对
* @param keyValues 键值二维数组
* @return 返回添加的map
*/
public Map<K, V> put(Object[]... keyValues){
Object key,value;
Map<K, V> map = null;
int i = 0;
for(Object[] keyValue : keyValues){
key = keyValue[0];
value = keyValue[1];
if(i == 0) {
map = putNew(keyClass.cast(key), valueClass.cast(value));
}else{
map = put(keyClass.cast(key), valueClass.cast(value));
}
i++;
}
return map;
}
/**
* 新增一个键值对
* @param key 键
* @param value 值
* @return 返回添加的键值对容器
*/
public Map<K, V> put(K key, V value){
Map<K, V> map = getLastMap();
map.put(key, value);
return map;
}
/**
* 新增一个new新的map,且添加值key-value
* @param key key
* @param value value
* @return 新增的map
*/
public Map<K, V> putNew(K key, V value){
Map<K, V> map = getNewMap();
map.put(key, value);
return map;
}
/**
* 新增一个键值对
* @param index 键
* @param key 键
* @param value 值
* @return 返回添加的键值对容器
*/
public Map<K, V> put(int index, K key, V value){
Map<K, V> map = get(index);
map.put(key, value);
return map;
}
/**
* 与另一个mapList比较
* @param mapList 另一个mapList
* @return 相等返回true,不想等返回false
*/
public boolean equals(MapList<K, V> mapList){
if(mapList == null){
return false;
}
if(this == mapList){
return true;
}
int size = size();
if(size != mapList.size()){
return false;
}
for(int i = 0; i < size; i++){
if(!isSameMap(get(i), mapList.get(i))){
return false;
}
}
return true;
}
/**
* 获取包含某个key的列表
* @param key key
* @return 列表
*/
public List<Map<K, V>> getContainKeyList(K key){
return stream().filter(map -> map.containsKey(key)).collect(Collectors.toList());
}
/**
* 获取包含某个key的列表
* @param key key
* @return 列表
*/
public MapList<K, V> getContainKeyMapList(K key){
return newMapList(getContainKeyList(key), keyClass, valueClass);
}
/**
* 校验两个map是否相等
* @param map 第一个map
* @param anotherMap 第二个map
* @return 相等返回true,不想等返回false
*/
private boolean isSameMap(Map<K, V> map, Map<K, V> anotherMap){
if(isNotSameObject(map, anotherMap)){
return false;
}
if(map.size() != anotherMap.size()){
return false;
}
K key;
V value, anotherValue;
for(Map.Entry<K, V> entry: map.entrySet()){
key = entry.getKey();
if(!anotherMap.containsKey(key)){
return false;
}
value = entry.getValue();
anotherValue = anotherMap.get(key);
if(isNotSameObject(value, anotherValue)){
return false;
}
}
return true;
}
/**
* 校验两个Object是否相等
* @param object 第一个object
* @param anotherObject 第二个object
* @return 相等返回true,不想等返回false
*/
private boolean isNotSameObject(Object object, Object anotherObject){
if(object == anotherObject){
return false;
}
if(object != null && anotherObject == null){
return true;
}
if(object == null){
return true;
}
return !object.equals(anotherObject);
}
/**
* 获取最后一个Map
* @return 最后一个map
*/
private Map<K,V> getLastMap(){
if(isEmpty()){
add(new HashMap<>(DEFAULT_CAPACITY));
}
int size = size();
return get(size -1);
}
/**
* 获取一个新的Map
* @return 新的Map
*/
private Map<K,V> getNewMap(){
Map<K, V> map = new HashMap<>(DEFAULT_CAPACITY);
add(map);
return map;
}
}
猜你喜欢
- 2024-10-18 【Python】map函数的常见用法,你知道多少?
- 2024-10-18 Python 中的数据可视化:将列表转换为图形
- 2024-10-18 Java 把一个 List 转换为字符串(java list转成字符串)
- 2024-10-18 Java Stream API:将线性集合添加到Map,键为对象属性
- 2024-10-18 SpringBoot读取配置文件中的数据到map和list
- 2024-10-18 一日一技:举例说明python中的map()方法
- 2024-10-18 详解 Python Map 函数(python map函数的用法)
- 2024-10-18 你应该知道的Java Map 的七个常见问题!
- 2024-10-18 Java核心数据结构(List、Map、Set)原理与使用技巧
- 2024-10-18 在JAVA中,List集合去重的方式有哪些?下面有你不知道的吗?
- 最近发表
- 标签列表
-
- cmd/c (64)
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- sqlset (64)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)