【JAVA 三键KEY 对应 VALUE,MAP】

这个博客介绍了一个名为TriKey的Java类,它实现了使用三个键(X、Y、Z)来映射一个值(V)的数据结构。TriKey内部使用了ConcurrentHashMap以确保线程安全,并提供了put和get方法进行数据操作。示例展示了如何创建和使用这个类来存储和检索数据。

JAVA 三键KEY 对应 VALUE,MAP

package com.quickhot.utilities;/*
 *   @author wangjin
 *   @date 2022/5/11
 */

import java.util.ArrayList;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 三键对应值,全部采用泛型。可随意使用。
 * three key map
 * @param <X> x key值
 * @param <Y> y key值
 * @param <Z> z key值
 * @param <V> v value值
 */
public final class TriKey <X,Y,Z,V>{
    private X x;
    private Y y;
    private Z z;
    private ConcurrentHashMap<X, ArrayList<V>> xList = new ConcurrentHashMap<>();
    private ConcurrentHashMap<Y, ArrayList<V>> yList = new ConcurrentHashMap<>();
    private ConcurrentHashMap<Z, ArrayList<V>> zList = new ConcurrentHashMap<>();

    public void put(X x,Y y,Z z,V v){
        ArrayList<V> avialable = get(x,y,z);
        if (null != avialable){
            xList.get(x).removeAll(avialable);
            yList.get(y).removeAll(avialable);
            zList.get(z).removeAll(avialable);
        }
        if (xList.containsKey(x)){
            xList.get(x).add(v);
        } else {
            ArrayList<V> xArrList = new ArrayList<>();
            xArrList.add(v);
            xList.put(x,xArrList);
        }

        if (yList.containsKey(y)){
            yList.get(y).add(v);
        } else {
            ArrayList<V> yArrList = new ArrayList<>();
            yArrList.add(v);
            yList.put(y,yArrList);
        }

        if (zList.containsKey(z)){
            zList.get(z).add(v);
        } else {
            ArrayList<V> zArrList = new ArrayList<>();
            zArrList.add(v);
            zList.put(z,zArrList);
        }
    }

    public ArrayList<V> get(X x, Y y, Z z){
        ArrayList<V> xs = xList.get(x);
        ArrayList<V> ys = yList.get(y);
        ArrayList<V> zs = zList.get(z);

        if(null==xs || null==ys || null==zs) return null;

        ArrayList<V> result = new ArrayList<>(xs);
        result.retainAll(ys);
        result.retainAll(zs);
        return result;
    }

}

使用方法

    public void run(ApplicationArguments args) throws Exception {
        TriKey testTriKey = new TriKey();
        testTriKey.put(0,0,0,"坐标000");
        testTriKey.put(0,0,0,"第二坐标000");
        testTriKey.put(0,0,1d,"坐标001");
        testTriKey.put(0,"b",0,"坐标010");
        testTriKey.put(0,"b",0,"坐标010b");
        testTriKey.put(0,1,1,"坐标011");
        testTriKey.put(1,0,0,100);

        ArrayList value = testTriKey.get(0, "b", 0);
        logger.info(value.toString());

        ArrayList value1 = testTriKey.get(0, 1, 1);
        logger.info(value1.toString());

        ArrayList value2 = testTriKey.get(0, 0, 0);
        logger.info(value2.toString());
    }
#include <STC15F2K60S2.H> #define Y4C(x) {P0=x;P2=P2&0x1f|0x80;P2=0x1f;} #define Y5C(x) {P0=x;P2=P2&0x1f|0xa0;P2=0x1f;} #define Y6C(x) {P0=x;P2=P2&0x1f|0xc0;P2=0x1f;} #define Y7C(x) {P0=x;P2=P2&0x1f|0xe0;P2=0x1f;} unsigned char led_state=0xff; unsigned char y5c_state=0x00; unsigned char cnt_key=0; code unsigned char Seg_Table[] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E}; unsigned char Nixie[]={0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff}; void Timer0_Init(void) //1毫秒@12.000MHz { AUXR &= 0x7F; //定时器时钟12T模式 TMOD &= 0xF0; //设置定时器模式 TL0 = 0x18; //设置定时初始值 TH0 = 0xFC; //设置定时初始值 TF0 = 0; //清除TF0标志 TR0 = 1; //定时器0开始计时 ET0 = 1; //使能定时器0中断 } /*系统初始化*/ void System_Init() { Y4C(0xff); Y5C(0x00); Y6C(0xff); Y7C(0xff); Timer0_Init(); //系统初始化里别忘了这句 EA=1; } /*数码管显示*/ void Nixie_show() { static unsigned pos=0; //这里和后面的key_old要加static Y7C(0xff); Y6C(0x01<<pos); Y7C(Nixie[pos]); if(++pos>=8) pos=0; } /*独立按键*/ unsigned char Key_scan() { unsigned char key_temp,key_value; P3|=0x0f; key_temp=P3&0x0f; switch(key_temp) { case 0x07:key_value=4;break; case 0x0b:key_value=5;break; case 0x0d:key_value=6;break; case 0x0e:key_value=7;break; case 0x03:key_value=9;break; default: key_value=0; } return key_value; //别忘了return真值 } /*按键*/ void Key() { unsigned char key_value,key_down,key_up; static unsigned char key_old=0; if(cnt_key<10) return; cnt_key=0; key_value=Key_scan(); key_down=key_value&(key_value^key_old); key_up=~key_value&(key_value^key_old); key_old=key_value; //注意别少了这句 switch(key_down) { case 9:led_state=0xfe;break; } } void main() { System_Init(); while(1) { Key(); } } void Timer0_Isr(void) interrupt 1 { if(cnt_key<10) cnt_key++; Y4C(led_state); } 为什么先按S4再按S5LED亮,先按S5再按S4LED就不亮呢
最新发布
11-08
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值