一、设计一个简易数据库系统,包含create,insert,select三个指令。
create(int tableId,int colNum,String key):创建表,其id为tableId,如果该表已存在,则不做任何处理。colNum为表中列的数量,列名由a-z字母组成,并按a-z顺序编号。比如colNum=3,则代表列分别为a,b,c。
key为主键(指1列或多列组合),key中每个字符代表一列,如key=bc,表示主键由列b和列c组合。
insert(int tableId,int[] values):添加一条记录。values每个元素按照顺序一一对应每列的值。如果主键冲突,则不做任何处理。
select(int tableId,String[] conditions):根据条件查询记录,并按照主键升序输出结果。其中condition仅为等于条件,比如b=32。
主键升序指的是按照keys中列出现的顺序依次进行排序,每列按值大小升序输出。如keys=ba,则先按照b列升序排序,如果b列值相同,则再按照a列升序排序。
样例
create:1,3,a
insert:1,2 3 7
insert:1,4 5 6
insert:1,3 4 6
select:1, b=5 and c=6
输出
4 5 6
二、算法实现
// 存放tableId和对应的值Map<Integer, List<int[]>> tables = new HashMap<>();// 存放tableId和主键Map<Integer, String> tableKey = new HashMap<>();// 存放主键对应的值,用于校验是否有冲突Set<String> id = new HashSet<>();// 创建private void create(int tableId, int colNum, String keys) {if (!tables.containsKey(tableId)) {tables.put(tableId, new ArrayList<>());tableKey.put(tableId, keys);}}// 插入private void inset(int tableId, int[] values) {String keys = tableKey.get(tableId);char[] charArray = keys.toCharArray();StringBuilder sb = new StringBuilder();for (char c : charArray) {sb.append(values[c - 'a']).append(";");}sb.append(tableId);if (!id.contains(sb.toString())) {id.add(sb.toString());tables.get(tableId).add(values);}}// 查询private List<int[]> select(int tableId, String[] conditions) {List<int[]> datas = tables.get(tableId);Map<Character, Integer> map = new HashMap<>();for (String condition : conditions) {String[] split = condition.split("=");map.put(split[0].charAt(0), Integer.valueOf(split[1]));}List<int[]> result = new ArrayList<>();for (int[] data : datas) {boolean match = true;for (Character c : map.keySet()) {int index = c - 'a';if (data[index] != map.get(c)) {match = false;break;}}if (match) {result.add(data);}}sortData(result, tableKey.get(tableId));return result;}// 对主键升序排序private void sortData(List<int[]> result, String key) {result.sort((o1, o2) -> {char[] charArray = key.toCharArray();for (char c : charArray) {int index = c - 'a';if (o1[index] != o2[index]) {return o1[index] - o2[index];}}return 0;});}