- Đọc file json, extract lấy object mình cần rồi convert về List<POJO>
- Thực hiện thuật toán
- Print List và kết thúc
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.JsonPath;
import com.jayway.jsonpath.TypeRef;
import com.jayway.jsonpath.spi.json.JacksonJsonProvider;
import com.jayway.jsonpath.spi.mapper.JacksonMappingProvider;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.File;
import java.io.IOException;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
public class RangeDates {
public static void main(String[] args) throws IOException {
List<DateInfo> dates = getJson("$.small.ranges");
List<DateInfo> newDates = getDateInfos(dates);
newDates.forEach(System.out::println);
System.out.println("----------------------");
List<DateInfo> dates2 = getJson("$.medium.ranges");
List<DateInfo> newDates2 = getDateInfos(dates2);
newDates2.forEach(System.out::println);
}
private static List<DateInfo> getDateInfos(List<DateInfo> dates) {
//nếu list rỗng, return luôn
if (dates.size() == 0) {
return Collections.emptyList();
}
for (int i = 0; i < dates.size(); i++) {
LocalDateTime tmpStart = dates.get(i).getStart_time();
LocalDateTime tmpEnd;
//nếu i là phần tử cuối cùng thì break loop
if (i == dates.size() - 1) {
break;
}
/*
So sánh 2 dates, nếu true thì
- set date1 = null,
- set date2 = start của date1 và end của date 2
*/
if (test(dates.get(i), dates.get(i+1))) {
tmpEnd = dates.get(i+1).getEnd_time();
dates.set(i, null);
dates.set(i+1, new DateInfo(tmpStart, tmpEnd));
}
}
//remove null trong list trước khi return
return dates.stream().filter(Objects::nonNull).collect(Collectors.toList());
}
// so sánh start của date2 và end của date1
private static boolean test(DateInfo date1, DateInfo date2) {
LocalDateTime to1 = date1.getEnd_time();
LocalDateTime from2 = date2.getStart_time();
return to1.isAfter(from2) || to1.isEqual(from2);
}
private static List<DateInfo> getJson(String path) throws IOException {
File json = new File("java_intermediate/src/test/resources/test.json");
Configuration configuration = Configuration.builder()
.jsonProvider(new JacksonJsonProvider())
.mappingProvider(new JacksonMappingProvider())
.build();
List<DateInfo> dates = JsonPath.using(configuration).parse(json)
.read(path, new TypeRef<>() {
});
dates.sort(Comparator.comparing(DateInfo::getStart_time));
return dates;
}
@Data
@AllArgsConstructor
@NoArgsConstructor
static class DateInfo {
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
private LocalDateTime start_time;
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
private LocalDateTime end_time;
@Override
public String toString() {
return "DateInfo{" +
"start_time=" + Timestamp.valueOf(start_time) +
", end_time=" + Timestamp.valueOf(end_time) +
'}';
}
}
}
Để convert từ json về list<POJO> ta cần:
- Tạo POJO, ở đây là
DateInfo - Tạo field cho DateInfo:
LocalDateTime start_timevàLocalDateTime end_time - Add thêm các annotation để convert
Stringdate-time về objectLocalDateTime
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
@JsonDeserialize(using = LocalDateTimeDeserializer.class)
@JsonSerialize(using = LocalDateTimeSerializer.class)
- Sử dụng thư viện JsonPath để extract json –> map về
List<DateInfo> - Sort
List<DateInfo>theo thứ tựstart_timetăng dần, rồi mới return
Các thư viện cần có
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.12.4</version>
</dependency>
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
<version>2.12.4</version>
</dependency>