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)過 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) { //記錄開始時(shí)間 record = new ActionTime(); record.setStartTime(data.getTimestamp()); //設(shè)置標(biāo)志位 isFirst = false; isAppear = true; } } else { //判斷前面是否已經(jīng)出現(xiàn)過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; } /** * 分割字符串,如果開始位置大于字符串長(zhǎng)度,返回空 * * @param str 原始字符串 * @param f 開始位置 * @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)過 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) { //記錄開始時(shí)間 record = new ActionTime(); record.setStartTime(data.getTimestamp()); //設(shè)置標(biāo)志位 isFirst = false; isAppear = true; } } else { //判斷前面是否已經(jīng)出現(xiàn)過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)文章
JAVAEE中用Session簡(jiǎn)單實(shí)現(xiàn)購物車功能示例代碼
本篇文章主要介紹了JAVAEE中用Session簡(jiǎn)單實(shí)現(xiàn)購物車功能示例代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2017-03-03泛型的類型擦除后fastjson反序列化時(shí)如何還原詳解
這篇文章主要為大家介紹了泛型的類型擦除后fastjson反序列化時(shí)如何還原詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11Javas使用Redlock實(shí)現(xiàn)分布式鎖過程解析
這篇文章主要介紹了Javas使用Redlock實(shí)現(xiàn)分布式鎖過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08springboot手動(dòng)事務(wù)回滾的實(shí)現(xiàn)代碼
這篇文章主要介紹了springboot手動(dòng)事務(wù)回滾的實(shí)現(xiàn)方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07Spring如何基于xml實(shí)現(xiàn)聲明式事務(wù)控制
這篇文章主要介紹了Spring如何基于xml實(shí)現(xiàn)聲明式事務(wù)控制,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-10-10java集合Collection實(shí)現(xiàn)類解析ArrayList?LinkedList及Vector
這篇文章主要為大家介紹了java集合Collection實(shí)現(xiàn)類解析ArrayList?LinkedList及Vector,有需要的朋友可以借鑒參考下,希望能夠有所幫助2022-03-03Java開發(fā)學(xué)習(xí) Eclipse項(xiàng)目有紅感嘆號(hào)解決之道
這篇文章主要為大家詳細(xì)介紹了完美解決Eclipse項(xiàng)目有紅感嘆號(hào)問題的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04