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

这篇文章主要介绍了java取某段/某个时间段的值的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧


直接上代码


测试类

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");
  }

    @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;
  }
}


实体类

@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);
  }
}

程序员之家

程序员之家
请先登录后发表评论
  • 最新评论
  • 总共0条评论