«

自定义有序Map

时间:2024-12-31 11:04     作者:紫琪软件工作室     分类: 工具集


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 + "]";
    }

}