# Data Stream as Disjoint Intervals

This page explains Java solution to problem `Data Stream as Disjoint Intervals` using `TreeMap` data structure.

## Problem Statement

Given a data stream input of non-negative integers `a1, a2, ..., an, ...`, summarize the numbers seen so far as a list of disjoint intervals.

For example, suppose the integers from the data stream are `1, 3, 7, 2, 6, ...,` then the summary will be: [1, 1]
[1, 1], [3, 3]
[1, 1], [3, 3], [7, 7]
[1, 3], [7, 7]
[1, 3], [6, 7]

## Solution

If you have any suggestions in below code, please create a pull request by clicking here.
``````
package com.vc.hard;

import java.util.*;

class DataStreamAsDisjointIntervals {

TreeMap<Integer, int[]> treeMap;

/** Initialize your data structure here. */
public DataStreamAsDisjointIntervals() {
this.treeMap = new TreeMap<>();
}

if(treeMap.containsKey(val)) return;

Integer l = treeMap.lowerKey(val);
Integer h = treeMap.higherKey(val);

if(l != null && h != null && treeMap.get(l)[1] + 1 == val && h == val + 1) {
treeMap.get(l)[1] = treeMap.get(h)[1];
treeMap.remove(h);
}
else if(l != null && treeMap.get(l)[1] + 1 >= val) {
treeMap.get(l)[1] = Math.max(treeMap.get(l)[1], val);
}
else if(h != null && h == val + 1) {
treeMap.put(val, new int[]{val, treeMap.get(h)[1]});
treeMap.remove(h);
}
else {
treeMap.put(val, new int[]{val, val});
}
}

public int[][] getIntervals() {
int[][] res = new int[treeMap.size()][2];
int index = 0;
for(int[] element: treeMap.values()) {
res[index++] = element;
}
return res;
}
}

/**
* Your SummaryRanges object will be instantiated and called as such:
* SummaryRanges obj = new SummaryRanges();