java取某段/某個(gè)時(shí)間段的值的方法
直接上代碼
測(cè)試類
public class TestData {
public static void main(String[] args) {
List<TsData> list = new ArrayList<>();
list.add(new TsData("11","08",11111l));
list.add(new TsData("11","080405",22222l));
list.add(new TsData("11","09070802",33333l));
list.add(new TsData("11","09234567",44444l));
list.add(new TsData("11","9867342",55555l));
list.add(new TsData("11","08607342",55555l));
list.add(new TsData("11","08607342",555556l));
list.add(new TsData("11","dad8607342",5555567l));
System.out.println(doCalculateActionTime(list,"08")+" uiui");
}
public static List<ActionTime> doCalculateActionTime(List<TsData> tsData, String action) {
//step1:按照兩位一個(gè)分解動(dòng)作代碼
//step2:找到動(dòng)作代碼總包含action代碼的時(shí)間,找到第一次出現(xiàn)的時(shí)間和最后一次出現(xiàn)的時(shí)間
List<ActionTime> actionTime = new ArrayList<>();
if (CollectionUtils.isEmpty(tsData)) {
return actionTime;
}
//是不是第一次出現(xiàn)
boolean isFirst = true;
//是不是已經(jīng)出現(xiàn)過(guò)
boolean isAppear = false;
ActionTime record = new ActionTime();
for (TsData data : tsData) {
if (null == data.getTimestamp() || StringUtils.isEmpty(data.getValue())) {
continue;
}
List<String> actions = ProjectStringUtil.getStrList(data.getValue(), 2);
System.out.println(actions+" actions");
//第一次出現(xiàn),則記錄時(shí)間,最后一次出現(xiàn)也記錄時(shí)間
if (actions.contains(action)) {
if (isFirst) {
//記錄開(kāi)始時(shí)間
record = new ActionTime();
record.setStartTime(data.getTimestamp());
//設(shè)置標(biāo)志位
isFirst = false;
isAppear = true;
}
} else {
//判斷前面是否已經(jīng)出現(xiàn)過(guò)action
if (isAppear) {
//記錄結(jié)束時(shí)間
record.setEndTime(data.getTimestamp());
actionTime.add(record);
//重置標(biāo)志位
isAppear = false;
isFirst = true;
}
}
}
return actionTime;
}
}
實(shí)體類
@Data
@AllArgsConstructor
@NoArgsConstructor
public class TsData {
private String label;
private String value;
private Long timestamp;
}
工具類
public class ProjectStringUtil {
/**
* 把原始字符串分割成指定長(zhǎng)度的字符串列表
*
* @param inputString 原始字符串
* @param length 指定長(zhǎng)度
* @return
*/
/**
* 把原始字符串分割成指定長(zhǎng)度的字符串列表
*
* @param inputString 原始字符串
* @param length 指定長(zhǎng)度
* @param size 指定列表大小
*/
public static List<String> getStrList(String inputString, int length, int size) {
List<String> list = new ArrayList<String>();
for (int index = 0; index < size; index++) {
String childStr = substring(inputString, index * length,
(index + 1) * length);
list.add(childStr);
}
return list;
}
/**
* 分割字符串,如果開(kāi)始位置大于字符串長(zhǎng)度,返回空
*
* @param str 原始字符串
* @param f 開(kāi)始位置
* @param t 結(jié)束位置
*/
public static String substring(String str, int f, int t) {
if (f > str.length()) {
return null;
}
if (t > str.length()) {
return str.substring(f);
} else {
return str.substring(f, t);
}
}
public static List<String> getStrList(String inputString, int length) {
int size = inputString.length() / length;
if (inputString.length() % length != 0) {
size += 1;
}
return getStrList(inputString, length, size);
}
}
測(cè)試類改進(jìn)
@Override
public List<ActionTime> doCalculateActionTime(List<TsData> tsData, String action) {
//step1:按照兩位一個(gè)分解動(dòng)作代碼
//step2:找到動(dòng)作代碼總包含action代碼的時(shí)間,找到第一次出現(xiàn)的時(shí)間和最后一次出現(xiàn)的時(shí)間
List<ActionTime> actionTime = new ArrayList<>();
if (CollectionUtils.isEmpty(tsData)) {
return actionTime;
}
//去重
tsData = tsData.stream().collect(
Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(TsData::getTimestamp))),
ArrayList::new));
// 排序
tsData = tsData.stream().sorted(Comparator.comparing(TsData::getTimestamp)).collect(Collectors.toList());
//是不是第一次出現(xiàn)
boolean isFirst = true;
//是不是已經(jīng)出現(xiàn)過(guò)
boolean isAppear = false;
ActionTime record = new ActionTime();
for (TsData data : tsData) {
if (null == data.getTimestamp() || StringUtils.isEmpty(data.getValue())) {
continue;
}
List<String> actions = ProjectStringUtil.getStrList(data.getValue(), 2);
//第一次出現(xiàn),則記錄時(shí)間,最后一次出現(xiàn)也記錄時(shí)間
if (actions.contains(action)) {
if (isFirst) {
//記錄開(kāi)始時(shí)間
record = new ActionTime();
record.setStartTime(data.getTimestamp());
//設(shè)置標(biāo)志位
isFirst = false;
isAppear = true;
}
} else {
//判斷前面是否已經(jīng)出現(xiàn)過(guò)action
if (isAppear) {
//記錄結(jié)束時(shí)間
record.setEndTime(data.getTimestamp());
actionTime.add(record);
//重置標(biāo)志位
isAppear = false;
isFirst = true;
}
}
}
return actionTime;
}
到此這篇關(guān)于java取某段/某個(gè)時(shí)間段的值的方法的文章就介紹到這了,更多相關(guān)java取某段/某個(gè)時(shí)間段值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)把文件壓縮成zip文件的示例代碼
這篇文章主要為大家介紹了如何通過(guò)Java語(yǔ)言實(shí)現(xiàn)將文件壓縮成zip文件,本文中示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02
Java如何Mock FileInputStream問(wèn)題
這篇文章主要介紹了Java如何Mock FileInputStream問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09
Java異常:java.net.UnknownHostException產(chǎn)生的原因和解決方案
這篇文章主要給大家介紹了關(guān)于Java異常:java.net.UnknownHostException產(chǎn)生的原因和解決方案,這個(gè)異常是java.net包中的一部分,具體說(shuō)它是類的一個(gè)實(shí)例,異常通常是由主機(jī)名無(wú)法解析為IP地址引起的,文中將解決的辦法介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01
Spring之借助Redis設(shè)計(jì)一個(gè)簡(jiǎn)單訪問(wèn)計(jì)數(shù)器的示例
本篇文章主要介紹了Spring之借助Redis設(shè)計(jì)一個(gè)簡(jiǎn)單訪問(wèn)計(jì)數(shù)器的示例,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06
JAVA多線程進(jìn)階方式(Runnable接口的講解和運(yùn)用)
這篇文章主要介紹了JAVA多線程進(jìn)階方式(Runnable接口的講解和運(yùn)用),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01
Java中雙冒號(hào)運(yùn)算符(::)的用法詳解
在Java 8引入的Lambda表達(dá)式和函數(shù)式接口之后,雙冒號(hào)運(yùn)算符(::)成為了一項(xiàng)重要的功能,下面我們就來(lái)學(xué)習(xí)一下Java中的雙冒號(hào)運(yùn)算符及其常見(jiàn)應(yīng)用場(chǎng)景吧2023-12-12

