java实现一种多key对单value的数据篮子

折月煮酒 提交于 2020-01-17 18:06:26

实现数据篮子:多key对应1value,并提供put,get,remove等方法

例如:
key1=“张三”
key1,key2=“李四”
key1,key2,key3=“王五”

思路:
1.通过拓展map实现key-value键值对存储
2.put方法可变参数个数为n且至少为2,形如map.put(key1,key2,key3,…,value),key为1到(n-1)参数,第n个为value

3.考虑到前面的n-1个key有序,可以考虑用LinkedList存储所有key记为keyList

4.那么这个特殊的map就相当于keyList=value键值对,即Map<List, Object>

思路捋清楚了,算法片段如下:

public class Bus {

    //初始化数据篮子
    private static Map<List<Object>, Object> busMap = new HashMap<List<Object>, Object>();
    //参数数组
    private static Object[] arg;

    public Boolean put(Object... args) {
        //判断参数个数小于2,添加失败
        if (args.length < 2) {
            return false;
        }
        arg = (Object[]) args;
        
        //设置key的集合
        List<Object> key = setKey(arg, arg.length - 1);
        
        //put(key,value)
        busMap.put(key, args[args.length - 1]);
        return true;
    }

    public static List<Object> setKey(Object[] arg, int len) {
        //初始化存key集合
        List<Object> keyList = new LinkedList<>();
        //(1到n-1个参数)作为key存到keyList
        for (int i = 0; i < len; i++) {
            keyList.add(arg[i]);
        }
        return keyList;
    }

    public Object remove(Object... args) {
        arg = (Object[]) args;
        List<Object> key = setKey(arg, arg.length);
        return busMap.remove(key);
    }

    public Object get(Object... args) {
        if (args.length < 1) {
            return false;
        }
        arg = (Object[]) args;
        List<Object> key = setKey(arg, arg.length);
        return busMap.get(key);
    }

    public int size() {
        return busMap.size();
    }

现在开始测试:

 public static void main(String[] args) {
        Bus bus = new Bus();
        bus.put("key1","张三");
        bus.put("key1","key2","李四");
        bus.put("key1","key2","key3","王五");

        System.out.println("the result1 is:\t"+bus.get("key1"));
        System.out.println("the result2 is:\t"+bus.get("key1","key2"));
        System.out.println("the result3 is:\t"+bus.get("key1","key2","key3"));
     
        bus.remove("key1");
        System.out.println("the result1 is:\t"+bus.get("key1"));

        bus.remove("key1","key2","key3");
        System.out.println("the result3 is:\t"+bus.get("key1","key2","key3"));

        System.out.println("the result2 is:\t"+bus.get("key1","key2"));

 }

输出

the result1 is:	张三
the result2 is:	李四
the result3 is:	王五
the result1 is:	null
the result3 is:	null
the result2 is:	李四

但是如果key数组是多个实体类呢,这里就需要每个实体类都实现hashCode跟equals方法了,这里不多测试

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!