系统设计题-简易数据库系统

一、设计一个简易数据库系统,包含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;
        });
    }
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值