java取某段/某個時間段的值的方法
阿新 • • 發佈:2020-11-13
直接上程式碼
測試類
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",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:按照兩位一個分解動作程式碼 //step2:找到動作程式碼總包含action程式碼的時間,找到第一次出現的時間和最後一次出現的時間 List<ActionTime> actionTime = new ArrayList<>(); if (CollectionUtils.isEmpty(tsData)) { return actionTime; } //是不是第一次出現 boolean isFirst = true; //是不是已經出現過 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"); //第一次出現,則記錄時間,最後一次出現也記錄時間 if (actions.contains(action)) { if (isFirst) { //記錄開始時間 record = new ActionTime(); record.setStartTime(data.getTimestamp()); //設定標誌位 isFirst = false; isAppear = true; } } else { //判斷前面是否已經出現過action if (isAppear) { //記錄結束時間 record.setEndTime(data.getTimestamp()); actionTime.add(record); //重置標誌位 isAppear = false; isFirst = true; } } } return actionTime; } }
實體類
@Data @AllArgsConstructor @NoArgsConstructor public class TsData { private String label; private String value; private Long timestamp; }
工具類
public class ProjectStringUtil { /** * 把原始字串分割成指定長度的字串列表 * * @param inputString 原始字串 * @param length 指定長度 * @return */ /** * 把原始字串分割成指定長度的字串列表 * * @param inputString 原始字串 * @param length 指定長度 * @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; } /** * 分割字串,如果開始位置大於字串長度,返回空 * * @param str 原始字串 * @param f 開始位置 * @param t 結束位置 */ 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); } }
測試類改進
@Override public List<ActionTime> doCalculateActionTime(List<TsData> tsData,String action) { //step1:按照兩位一個分解動作程式碼 //step2:找到動作程式碼總包含action程式碼的時間,找到第一次出現的時間和最後一次出現的時間 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()); //是不是第一次出現 boolean isFirst = true; //是不是已經出現過 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); //第一次出現,則記錄時間,最後一次出現也記錄時間 if (actions.contains(action)) { if (isFirst) { //記錄開始時間 record = new ActionTime(); record.setStartTime(data.getTimestamp()); //設定標誌位 isFirst = false; isAppear = true; } } else { //判斷前面是否已經出現過action if (isAppear) { //記錄結束時間 record.setEndTime(data.getTimestamp()); actionTime.add(record); //重置標誌位 isAppear = false; isFirst = true; } } } return actionTime; }
到此這篇關於java取某段/某個時間段的值的方法的文章就介紹到這了,更多相關java取某段/某個時間段值內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!