当前位置: 首页 > article >正文

自定义有序Map

package cn.ziqirj.common.utils;

import lombok.Getter;
import lombok.Setter;

import java.util.ArrayList;
import java.util.List;

/**
 * 模拟Map集合,key不可重复,按插入顺序排序
 * @author zhangji
 *
 * @param <T>
 */
public class CustomOrderlyMap<T> {
	@Getter
    private List<String> keys = new ArrayList<>();
	@Getter
    private List<T> values = new ArrayList<>();
	private List<map<T>> kv = new ArrayList<>();
	
	public CustomOrderlyMap() {}

	/**
	 * 添加元素
	 * @param key 键
	 * @param value	值
	 */
	public void add(String key, T value) {
		Integer index = getIndex(key);
		if(null != index && index != -1) {
			values.set(index, value);
			kv.get(index).setValue(value);
			return ;
		}
		keys.add(key);
		values.add(value);
		kv.add(new map<T>(key, value));
	}

	/**
	 * 批量添加元素
	 * @param customMap 集合
	 */
	public void addAll(CustomOrderlyMap<T> customMap) {
		if(null == customMap || customMap.size() == 0) {
            return ;
        }
		List<map<T>> kvl = customMap.kv;
		for(map<T> map : kvl) {
            this.add(map.getKey(), map.getValue());
        }
	}

	/**
	 * 移除元素
	 * @param key 键
	 */
	public void remove(String key) {
		Integer index = getIndex(key);
		if(null == index || index == -1 ) {
            return ;
        }
		keys.remove(index);
		values.remove(index);
		kv.remove(index);
	}
	
	/**
	 * 移除元素
	 * @param obj 值
	 */
	public void remove(T obj) {
		Integer index = getIndex(obj);
		if(null == index || index == -1 ) {
            return ;
        }
		keys.remove(index);
		values.remove(index);
		kv.remove(index);
	}

	/**
	 * 清空集合
	 */
	public void removeAll() {
		this.keys = new ArrayList<>();
		this.values = new ArrayList<>();
		this.kv = new ArrayList<>();
	}
	
	/**
	 * 关闭集合
	 */
	public void close() {
		this.keys.clear();
		this.values.clear();
		this.kv.clear();
	}

	/**
	 * 设置元素
	 * @param key 键
	 * @param value 值
	 */
	public void set(String key, T value) {
		Integer index = getIndex(key);
		if(null == index || index.intValue() == -1)
			return ;
		values.set(index, value);
		kv.get(index).setValue(value);
	}

	/**
	 * 获取元素
	 * @param key 键
	 * @return T
	 */
	public T get(String key) {
		Integer index = getIndex(key);
		if (null == index || index == -1)
			return null;
		return kv.get(index).getValue();
	}

	/**
	 * 获取集合大小
	 * @return Integer
	 */
    public Integer size() {
		return this.kv.size();
	}

	/**
	 * 判断集合是否为空
	 * @return boolean
	 */
	public boolean isEmpty() {
		return this.kv.isEmpty();
	}
	
	/**
	 * 打印集合
	 */
	public void print() {
		if(isEmpty()) {
            System.out.println("null");
        }
		System.out.print("CustomMap : [");
		for(map<T> m : this.kv) {
			System.out.print(m.toString());
		}
		System.out.println("]");
	}

	/**
	 * 获取key的索引
	 * @param key 键
	 * @return Integer
	 */
	private Integer getIndex(String key) {
		int length = this.keys.size();
		if (length == 0) {
            return -1;
        }
		for (int i = 0; i < length; i++) {
            if (key.equals(keys.get(i))) {
                return i;
            }
        }
		return null;
	}
	
	/**
	 * 获取value的索引
	 * @param t 值
	 * @return Integer
	 */
	private Integer getIndex(T t) {
		int length = this.values.size();
		if (length == 0) {
            return -1;
        }
		for (int i = 0; i < length; i++) {
            if (t.equals(values.get(i))) {
                return i;
            }
        }
		return null;
	}

}

@Setter
@Getter
class map<T> {
	private String key;
	private T value;

	public map(String key, T value) {
		super();
		this.key = key;
		this.value = value;
	}

    @Override
	public String toString() {
		return "[K:" + key + " --> V:" + value + "]";
	}

}

个人博客:紫琪软件工作室


http://www.kler.cn/a/467860.html

相关文章:

  • VTK 鼠标+键盘重构
  • 【C++面向对象——类的多态性与虚函数】计算图像面积(头歌实践教学平台习题)【合集】
  • Debian、Ubuntu 22.04和ubuntu 24.04国内镜像源(包括 docker 源)
  • 在线机考|2024华为实习秋招春招编程题(最新)——第3题_个性化歌单推荐系统_300分(十一)
  • OSPF - 影响OSPF邻居建立的因素
  • Android 绘制学习总结
  • 【Java基础】力扣3、4
  • java项目之读书笔记共享平台(源码+文档)
  • ros常用命令记录
  • GOGOGO 抽象
  • 「Mac畅玩鸿蒙与硬件51」UI互动应用篇28 - 模拟记账应用
  • 大数据技术(七)—— HBase数据结构与架构
  • java接口下载zip,不生成中间文件,返回前端文件流
  • Fabric部署-docker安装
  • exam0-试卷整理
  • 小试牛刀-SpringBoot集成SOL链
  • 信息科技伦理与道德1:研究方法
  • Codeforces Round 995 (Div.3)
  • 探索 Google Test: 从基础断言到高级 Mock 技巧
  • js canvas绘制五星红旗
  • Outlook2024版如何回到经典Outlook
  • Windows 11 上通过 WSL (Windows Subsystem for Linux) 安装 MySQL 8
  • html+css+js网页设计 美食 美食天下2个页面(里面包含php和mysql)
  • Launcher3主页面加载显示流程分析
  • ROS节点架构设计:提高模块化与可扩展性
  • 算法解析-经典150(区间、栈)