区间合并工具Section

Section

section是一个区间merge工具类,工具类采用泛型+Comparator+递归来实现通用性处理,并预留data merge SPI提供具体的数据merge策略。

Usage

Create section

使用Section提供的工厂方法build来创建对象

1
Section<T> build(int startDate, int endDate, T data, Comparator comparator, DataProcessor<T> dataProcessor)

Merge method

merge one to one

1
List<Section<T>> merge(Section<T> source, Section<T> target)

merge one to List

1
List<Section<T>> merge(Section<T> source, List<Section<T>> target, boolean mergeSelf)

merge List to one

1
List<Section<T>> merge(List<Section<T>> source, Section<T> target, boolean mergeSelf)

merge List to List

1
List<Section<T>> merge(List<Section<T>> source, List<Section<T>> target)

Comparator

merge对象比较使用,用于判断两个数据是否可以合并,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static class SectionComparator implements Comparator<SectionModel> {
@Override
public int compare(SectionModel o1, SectionModel o2) {
return ComparisonChain.start()
.compare(o1.day, o2.day)
.compare(o1.desc, o2.desc)
.result();
}
}
```


### Merge SPI
#### SPI

interface DataProcessor {
T dataMerge(T source, T target);
}

1
#### Default Handler

public static class DefaultDataProcessor implements DataProcessor {

    @Override
    public T dataMerge(T source, T target) {
        return target;
    }
}
1
2
3
4
5



## Simple Example
### unit test

@Test
public void buildTest() {

    SectionModel sectionModel = new SectionModel();

    sectionModel.setStartDate(20150101);
    sectionModel.setEndDate(20160101);
    sectionModel.setDay(10);
    sectionModel.setDesc("123");
    Section<SectionModel> section = Section.build(sectionModel);

    SectionModel sectionModel2 = new SectionModel();

    sectionModel2.setStartDate(20151001);
    sectionModel2.setEndDate(20160601);
    sectionModel2.setDay(10);
    sectionModel2.setDesc("1234");
    Section<SectionModel> section2 = Section.build(sectionModel2);

    List<Section<SectionModel>> sectionList =  Section.merge(section,section2);

    System.out.println(sectionList);

}
1
### merge result

[Section{startDate=20150101, endDate=20150930, data=SectionModel{startDate=20150101, endDate=20160101, day=10, desc=123}}, Section{startDate=20151001, endDate=20160601, data=SectionModel{startDate=20151001, endDate=20160601, day=10, desc=1234}}]

```