时间段或时间点,合并。

时间段或时间点,合并。


package algorithms;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

class Tree {
    public class TimeTree {
        private String value;
        private String type;
        private TimeTree left;
        private TimeTree right;
        private int num;
        
        public int getNum() {
            return num;
        }
        public void setNum(int num) {
            this.num = num;
        }
        public String getValue() {
            return value;
        }
        public void setValue(String value) {
            this.value = value;
        }
        public String getType() {
            return type;
        }
        public void setType(String type) {
            this.type = type;
        }
        public TimeTree getLeft() {
            return left;
        }
        public void setLeft(TimeTree left) {
            this.left = left;
        }
        public TimeTree getRight() {
            return right;
        }
        public void setRight(TimeTree right) {
            this.right = right;
        }
    }
    
    public List<String> periodType = Arrays.asList("begin","end");

    //添加节点
    public TimeTree putTime(TimeTree tree, String time, String type) {
        if (tree == null) {
            tree = new TimeTree();
            tree.setValue(time);
            tree.setType(type);
            tree.setNum(1);
        }
        else if (tree.value.compareTo(time) > 0) {
            tree.left = putTime(tree.left, time, type);
        }
        else if (tree.value.compareTo(time) < 0) {
            tree.right = putTime(tree.right, time, type);
        }
        else if (tree.value.compareTo(time) == 0
                && (!tree.type.equals(type) && periodType.contains(tree.type) && periodType.contains(type))) {
            --tree.num;
            if (tree.num == 0){
                tree.setType("point");
            }
        }
        else if (tree.value.compareTo(time) ==0 
                && tree.type == type) {
            tree.setNum(1+tree.getNum());
        }
        else if (tree.value.compareTo(time) ==0 
                && tree.type.equals("point")) {
            
        }
        return tree;
    }
    
    public static void main(String args[]) {
        Tree tree = new Tree();
        
        TimeTree node = null;
        node = tree.putTime(node, "03", "begin");
        node = tree.putTime(node, "07", "end");
        node = tree.putTime(node, "03", "begin");
        node = tree.putTime(node, "04", "end");
        node = tree.putTime(node, "02", "begin");
        node = tree.putTime(node, "03", "end");
        node = tree.putTime(node, "07", "begin");
        node = tree.putTime(node, "08", "end");
        node = tree.putTime(node, "04", "point");
        node = tree.putTime(node, "07", "point");
        node = tree.putTime(node, "02", "point");
        node = tree.putTime(node, "10", "point");
        node = tree.putTime(node, "06", "begin");
        node = tree.putTime(node, "09", "end");
        List<String[]> btList = new ArrayList<>();
        tree.orderTree(node, btList);
        List<Periods> periodList = tree.TransList(btList);

        for (Periods period: periodList) {
            System.out.print(period.getBegin() + ",");
            System.out.print(period.getEnd());
            System.out.println();
        }
    }

    //二叉树中序排序
    public void orderTree(TimeTree node, List<String[]> btList) {
        if (node.getLeft() != null) {
            orderTree(node.getLeft(), btList);
        }
        for (int i=0; i<node.num; ++i) {
            String[] nodes = new String[]{node.getValue(),node.getType()};
            btList.add(nodes);
        }
        if (node.getRight() != null) {
            orderTree(node.getRight(), btList);
        }
    }
    
    //
    public class Periods {
        private String begin;
        private String end;
        
        public String getBegin() {
            return begin;
        }
        public void setBegin(String begin) {
            this.begin = begin;
        }
        public String getEnd() {
            return end;
        }
        public void setEnd(String end) {
            this.end = end;
        }
    }
    
    //游标提取
    public List<Periods> TransList(List<String[]> orderList) {
        List<Periods> periodList = new ArrayList<>();
        int beginNum = 0;
        int endNum = 0;
        String beginValue = "";
        boolean flag = false;
        
        
        for (String[] order: orderList) {
            if (!flag) {
                if (order[1].equals("begin")) {
                    beginValue = order[0];
                    ++beginNum;
                    flag = true;
                }
                else if (order[1].equals("point")) {
                    Periods periods = new Periods();
                    periods.setBegin(order[0]);
                    periods.setEnd(order[0]);
                    periodList.add(periods);
                    flag = true;
                }
            }
            else if (order[1].equals("begin")) {
                ++beginNum;
            }
            else if (order[1].equals("end") && beginNum != endNum) {
                ++endNum;
            }
            
            if (order[1].equals("end") && beginNum == endNum) {
                Periods periods = new Periods();
                periods.setBegin(beginValue);
                periods.setEnd(order[0]);
                periodList.add(periods);
                
                //重设
                beginNum = 0;
                endNum = 0;
                beginValue = "";
                flag = false;
            }
        }
        
        return periodList;
    }
    
}


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,475评论 4 372
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,744评论 2 307
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,101评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,732评论 0 221
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,141评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,049评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,188评论 2 320
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,965评论 0 213
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,716评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,867评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,341评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,663评论 3 263
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,376评论 3 244
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,200评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,990评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,179评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,979评论 2 279

推荐阅读更多精彩内容

  • 段姓起源姓氏字源 段字的本义是锤击、锤炼的意思。许慎《说文解字》对段字所作的解释是:“段,椎物也。”朱芳圃在《殷周...
    玉珠阳光阅读 2,104评论 0 3
  • 我一想到 因为父母的窘迫 因为自己的无能为力 我亲爱的弟弟 书都没读成 我的心 就纠在了一块 你与家庭共存亡 辗转...
    就静静听你说阅读 177评论 0 0
  • 最是不喜欢雨 更是不喜欢这四月的雨 少了六月雨的直快 九月雨的明爽 隆冬雨的凛冽 最是不喜欢雨 更是不喜欢这四月的...
    不今心阅读 420评论 5 13
  • 今天,海棠养多肉整整一周年了。一年来,从痴迷到理智痴迷,多肉已经成为海棠的心头肉。养肉路漫漫,几多欢喜几多泪,其中...
    半田仙阅读 856评论 2 9
  • 在一些复杂业务处理场景中,难免碰到一些业务需求:要根据数据库查询到数据,再进行分类汇总,甚至是和另一部分数据进行关...
    张晋鹏_JamesZhang阅读 344评论 0 0