题目二 数据篮子

一、【题目描述】

情景是这样,我需要一个数据篮子来满足系统各模块之间的数据共享,要求通过key-value的形式储存和访问数据,但单key太容易出现冲突了,所以要求支持多key(不限制key的数量)。

试题要求】

保存数据

bus.put(“key1”,”key2” ,value1);

bus.put(“key1”,”key2”,”key3”,value2);

注意每个key下面都可以储存数据

获取数据(key必须按照保存value时候key的顺序)

let value1=bus.get(“key1”,”key2”);

let value2=bus.get(“key1”,”key2”,”key3”);

清理数据

bus.remove(“key1”).   //把key1下面的所有节点删除

 二、直接上测试代码:

  1 package com.test.bus;
  2
  3 import java.util.Arrays;
  4 import java.util.HashMap;
  5 import java.util.Map;
  6
  7 /**
  8  * 数据篮子
  9  * @function
 10  * @author 小风微凉
 11  * @time  2018-9-15 上午10:19:44
 12  */
 13 public class Bus {
 14     /**
 15      * 数据仓库
 16      */
 17     private static Map desMap=new HashMap<Object[], Object>();
 18
 19     /**
 20      * 压入数据
 21      * @param args   key1,key2...value1
 22      * @return
 23      */
 24     public boolean put(Object... args){
 25         if(args.length==1){
 26             System.out.println("输入参数有误,至少输入2个参数!");
 27             return false;
 28         }
 29         Object[] curArr=new Object[args.length-1];
 30         for(int i=0;i<args.length;i++){
 31             if(i==args.length-1){//value
 32                 desMap.put(curArr, args[i]);
 33                 System.out.println("数据保存成功");
 34                 return true;
 35             }else{//key
 36                 System.arraycopy(args, 0, curArr, 0, args.length-1);
 37             }
 38         }
 39         return false;
 40     }
 41     /**
 42      * 判断key是否存在
 43      * @param Key
 44      * @return
 45      */
 46     private Object[] isExist(Object key){
 47         boolean flag=false;
 48         Object[] retObj=null;
 49         for(Object keys:desMap.keySet()){
 50             Object[] keyArr=(Object[]) keys;
 51             for(Object o:keyArr){
 52                 if(o==key || o.equals(key)){
 53                     flag=true;
 54                     retObj=keyArr;
 55                     break;
 56                 }
 57             }
 58         }
 59         return retObj;
 60     }
 61     /**
 62      * 判断key是否存在
 63      * @param keys  key1,key2,key3...
 64      * @return
 65      */
 66     private Object[] isExist(Object... keys){
 67         Object[] retObj=null;
 68         for(Object klist:desMap.keySet()){
 69             Object[] keyArr=(Object[]) klist;
 70             String curStr=printArr(keys);
 71             String srcStr=printArr(keyArr);
 72             if(srcStr.indexOf(curStr)!=-1){//找到了
 73                 retObj=keyArr;
 74                 break;
 75             }
 76         }
 77         return retObj;
 78     }
 79     /**
 80      * 将数组按照字符串的格式输出
 81      * @param arr
 82      * @return
 83      */
 84     private String printArr(Object[] arr){
 85         String str="";
 86         for(Object o:arr){
 87             str+=o.toString();
 88         }
 89         return str;
 90     }
 91     /**
 92      * 取值
 93      * @param args   key1,key2.key3...keyn
 94      * @return
 95      */
 96     public boolean get(Object... args){
 97         Object[] arrObj=isExist(args);
 98         boolean bol=false;
 99         if(arrObj!=null){//存在
100             System.out.println("查找结果:"+desMap.get(arrObj));
101             bol=true;
102         }else{
103             System.out.println("未找到对应的数据");
104         }
105         return bol;
106     }
107     public boolean remove(Object... args){
108         Object[] arrObj=isExist(args);
109         boolean bol=false;
110         if(arrObj!=null){//找到了
111             Object[] newObj=null;
112             for(int i=0;i<arrObj.length;i++){
113                 if(arrObj[i]==args[0]){
114                     //得到新数组
115                     newObj=new Object[i];
116                     System.arraycopy(arrObj, 0, newObj, 0, i);
117                     //删除map中旧数据
118                     Object value=desMap.get(arrObj);
119                     desMap.remove(arrObj);
120                     desMap.put(newObj, value);
121                     System.out.println("数据删除成功");
122                     break;
123                 }
124             }
125             bol=true;
126         }else{
127             System.out.println("未找到要删除的数据");
128         }
129         return bol;
130     }
131     private void prit(Object[] arr){
132         System.out.println("*********开始打印*************");
133         for(Object o:arr){
134             System.out.println(o);
135         }
136         System.out.println("*********打印结束*************");
137     }
138     public static void main(String[] args) {
139
140         Bus bus=new Bus();
141         //压入数据
142         bus.put("key1","key2","key3","key4","key5","key6","value1");
143         //打印key
144         System.out.println("当前仓库中数据-key");
145         for(Object key:desMap.keySet()){
146             Object[] keyArr=(Object[]) key;
147             for(Object o:keyArr){
148                 System.out.println(o);
149             }
150         }
151         //查找数据
152         bus.get("key1");
153         bus.get("key1","key2");
154         bus.get("key1","key2","key3");
155         bus.get("key1","key3");
156         //删除数据
157         bus.remove("key2","key3");
158         System.out.println("当前仓库中数据-key");
159         for(Object key:desMap.keySet()){
160             Object[] keyArr=(Object[]) key;
161             for(Object o:keyArr){
162                 System.out.println(o);
163             }
164         }
165         bus.get("key1","key3");
166         bus.get("key1");
167         //压入新的数据
168         bus.put("key1","key2","key3","value2");
169         bus.put("key1","key2","key3","value3");
170         //打印key
171         for(Object key:desMap.keySet()){
172             System.out.println(">----------------<");
173             Object[] keyArr=(Object[]) key;
174             for(Object o:keyArr){
175                 System.out.println(o);
176             }
177         }
178         //
179         bus.get("key1");
180     }
181     private void test1(){
182         new Bus().put("key1","key2","key3","value1");
183         for(Object key:desMap.keySet()){
184             Object[] keyArr=(Object[]) key;
185             for(Object o:keyArr){
186                 System.out.println(o);
187             }
188         }
189     }
190 }

原文地址:https://www.cnblogs.com/newwind/p/9680239.html

时间: 2024-11-10 11:14:43

题目二 数据篮子的相关文章

ExtJS 4.2 业务开发(二)数据展示和查询

本篇开始模拟一个船舶管理系统,提供查询.添加.修改船舶的功能,这里介绍其中的数据展示和查询功能. 目录 1. 数据展示 2. 数据查询 3. 在线演示 1. 数据展示 在这里我们将模拟一个船舶管理系统,并提供查询.添加.修改的功能. 大致的目录结构如下: ShipMgrTab.js :船舶业务的入口. controller 目录:存放船舶业务的逻辑控制文件. model 目录:存放船舶业务的model文件. store 目录 :存放船舶业务的store文件. view 目录 :存放船舶业务的组件

SQL语句汇总(二)——数据修改、数据查询

首先创建一张表如下,创建表的方法在上篇介绍过了,这里就不再赘述. 添加新数据: INSERT INTO <表名> (<列名列表>) VALUES (<值列表>)  如: INSERT INTO t_student (student_id,student_name,student_age,student_sex) VALUES (1,'大毛',18,'男'); 其中列名可以省略,省略之后要求插入的值必须与列一一对应: INSERT INTO t_student VALUE

《剑指Offer》题目——二维数组中的查找

题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数. 题目分析: 暴力破解时间复杂度太高,本题有两种思路:1. 将每行看成一个有序数组,用二分查找2. 从左下角开始查找,若大于该值,右移:若小于该值,上移,直到找到为止 public class ArraySearch { public static boolean Find(int target, int [][] ar

【未完待续】Java--算法特训(1)暴力破解和实用性优先(题目二)

关键词:列表法,枚举法 测试先行的写代码的方式: 1 public class testsuanfa { 2 public static int romeNum(String a ){ 3 return 1314; 4 } 5 public static void main(String[] args){ 6 System.out.println(romeNum("MCCXIV")); 7 } 8 9 } 题目: [1.8真题:罗马数字] 古罗马帝国开创了辉煌的人类文明,但他们的数字表

全球异地多活架构设计(二): 数据层的支持

要做到全球异地多活, 一定要在数据层支持多机房写入, 并且对大多数业务场景提供最终一致性的解决方案.原因如下: 跨洲的网络延迟在100ms的数量级,如果只有单点写, 对于用户体验是种灾难 对于高频操作来说,  如果做强一致性,那么任然受限于网络延迟, 对于用户体验是种灾难 既然决定要选择最终一致性, 那么随之而来就有两个问题需要解决: 跨机房的数据同步 多点写入时的数据冲突处理 一 .数据同步 数据的同步有几个核心问题需要考虑: 1.获取数据变更以及重放 2.不丢不重不乱序 3.避免数据回环同步

数据库系列学习(二)-数据表的创建和管理

1.数据类型 A:整数类型 bit,int,smallint,tinyint [与操作系统位数有关] B:数值类型 decimal,numeric,money,smallmoney,float,real [可存小数] C:字符相关类型 char,varchar,text,nchar,nvarchar,ntext D:日期时间类型 datetime(精确到0.01秒),smalldatetime(精确到分钟),timestamp E:二进制类型 image [经图片,视频转为二进制,保存到数据库]

EF Codefirst(二)数据注释

CodeFirst通过分析我们在代码里编写的类,以及类之间的关系生成数据库表,以及表之间的各种关系.数据库的表会涉及到主键,外键,列是否为空,列类型等等. 我们要通过怎样的方式来暴露这些信息呢? CodeFirst通过DataAnnotations(在 System.ComponentModel.DataAnnotations 命名空间中 )特性类标示这些信息. 常用的一些标识如下 主键 如果不存在符合EF默认规则的主键时,用key标注也可.个人不赞成这样,遵守默认规则就好,免去不必要麻烦. p

二.数据访问

第二章  数据访问 读书笔记: JavaScript 中有四种基本数据访问位置: 直接量:直接量仅仅代表自己,而不存储特定位置.字符串,数字,布尔,对象,数组,函数,正则表达式,具有特殊意义的空值,以及未定义. 变量:var关键字创建用于存储数据值. 数组项:具有数字索引,存储一个javascript数组对象. 对象成员: 具有字符串索引,存储一个javascript对象. 总的来说, 直接量和局部变量的访问速度要快于数组项和对象成员的访问速度. 管理作用域 每个javascript函数都被表示

Python实际应用-数据处理(二) 数据特定格式变化

目前的状况是: 1. 在我一个文件夹下面有许多文件名是这样的数据文件 part-m-0000 part-m-0001 part-m-0002 part-m-0003 ... 2. 其中每个文件夹里的数据是这样格式: "460030730101160","3","0","0","0","2013/8/31 0:21:42" "460036745672363","