635. Design Log Storage System

1. 我的代码

我的代码,长得像匹马,主要是比较时间那一块写得太冗长:

    public static class LogSystem {
        //      List<String> stamps = new ArrayList<>();
        HashMap<String[], Integer> map = new HashMap<>();

        public LogSystem() {

        }

        public void put(int id, String timestamp) {
            map.put(timestamp.split(":"), id);
        }

        public List<Integer> retrieve(String s, String e, String gra) {
            int graIndex;
            switch (gra) {
                case "Year":
                    graIndex = 0;
                    break;
                case "Month":
                    graIndex = 1;
                    break;
                case "Day":
                    graIndex = 2;
                    break;
                case "Hour":
                    graIndex = 3;
                    break;
                case "Minute":
                    graIndex = 4;
                    break;
                case "Second":
                    graIndex = 5;
                    break;
                default:
                    graIndex = 0;
            }
            //01这种能parseInt吗,可以
            String[] sArr = s.split(":");
            String[] eArr = e.split(":");
            ArrayList<Integer> res = new ArrayList<>();
            boolean sTrue = false;
            boolean eTrue = false;
            for (String[] key : map.keySet()) {
                for (int i = 0; i <= graIndex; i++) {
                    if (Integer.parseInt(key[i]) < Integer.parseInt(sArr[i])) {
                        break;
                    }
                    if (i < graIndex && Integer.parseInt(key[i]) > Integer.parseInt(sArr[i])) {
                        sTrue = true;
                        break;
                    }
                    if (i == graIndex && Integer.parseInt(key[i]) >= Integer.parseInt(sArr[i])) {
                        sTrue = true;
                    }
                }
                if (!sTrue){
                    continue;
                }
                for (int i = 0; i <= graIndex; i++) {
                    if (Integer.parseInt(key[i]) > Integer.parseInt(eArr[i])) {
                        break;
                    }

                    if (i < graIndex && Integer.parseInt(key[i]) < Integer.parseInt(eArr[i])) {
                        eTrue = true;
                        break;
                    }
                    if (i == graIndex && Integer.parseInt(key[i]) <= Integer.parseInt(eArr[i])) {
                        eTrue = true;
                    }
                }
                if (eTrue) {
                    res.add(map.get(key));
                }
                sTrue = false;
                eTrue = false;
            }
            return res;
        }
    }

2. 别人简洁的代码

首先我摘录一段String的compareTo方法的comment:

Compares two strings lexicographically.
The comparison is based on the Unicode value of each character in the strings.

所以不需要像我上面那样,把每个unit分开比较,而只需要比较lexicographically(字典序)就能找出target。

    public static class LogSystem {

        List<String[]> timestamps = new LinkedList<>();
        List<String> units = Arrays.asList("Year", "Month", "Day", "Hour", "Minute", "Second");
        int[] indices = new int[]{4,7,10,13,16,19};

        public void put(int id, String timestamp) {
            timestamps.add(new String[]{Integer.toString(id), timestamp});
        }

        public List<Integer> retrieve(String s, String e, String gra) {
            List<Integer> res = new LinkedList<>();
            int idx = indices[units.indexOf(gra)];
            for (String[] timestamp : timestamps) {
                if (timestamp[1].substring(0, idx).compareTo(s.substring(0, idx)) >= 0 &&
                        timestamp[1].substring(0, idx).compareTo(e.substring(0, idx)) <= 0) {
                    res.add(Integer.parseInt(timestamp[0]));
                }
            }
            return res;
        }
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 今晚一直在研究如何使用app理财,推荐随手攒,这款app感觉不错,目前只想要每天养成一个理财的动作,培养这个动作就好了。
    sula爱做梦阅读 3,558评论 0 0
  • 小王是我的大学同学,也是比较要好的一个,身高1米58,南方人,家里是山里的,经济条件一般。外貌长得还算过得去,谈不...
    墨笔生徽阅读 5,154评论 0 0
  • 大儒罗泽南临终时写给曾国藩的信中道:“乱极时站的住,才是有用之学。” 能够镇定坦然地处理极为混乱复杂局面的能力,才...
    常山郡小文阅读 3,025评论 0 0
  • 特里安的夜,挤在16人的宿舍里,窗外不时划过闪电。marco说他睡不着,看到闪电,心里默数到16,才传来轰隆隆的雷...
    写点儿什么吧阅读 3,666评论 2 1