当前位置 : 主页 > 编程语言 > java >

java取某段/某个时间段的值的方法

来源:互联网 收集:自由互联 发布时间:2021-04-03
直接上代码 测试类 public class TestData { public static void main(String[] args) { ListTsData list = new ArrayList(); list.add(new TsData("11","08",11111l)); list.add(new TsData("11","080405",22222l)); list.add(new TsData("11","0907

直接上代码

测试类

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:按照两位一个分解动作代码
    //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取某段/某个时间段值内容请搜索易盾网络以前的文章或继续浏览下面的相关文章希望大家以后多多支持易盾网络!

网友评论