之前遇到一个需求,字段是每小时那种(2018101208)。然后服务给我数据少了部分。然后我需要自已推算。然后补上没有那些小时为单位的数据。这里面也涉及到了自已设计出来数据list是全面的。所有的小时都有。然后把服务器获取list根据这个进行对比,补上服务器没有的小时数。两个list根据某个字段进行合并。
1、获取过去15天的小时
初始化变量
public String start_ts = "1537812000000";
//解析出来历史数据
private List<HistoryData> historyDataList = new ArrayList<>();
//自已推算的历史数据
private List<String> calculateDataList = new ArrayList<>();
获取系统当前时间,推算15天前这个时间,然后把每小时存在List<String>里面。这也是一个小小的算法。
public void SetContext(Context context) {
if (mContext != null) mContext.clear();
mContext = new WeakReference<Context>(context);
long time = System.currentTimeMillis();
SimpleDateFormat df = new SimpleDateFormat("yyyyMMddHH");
String strNow = df.format(time);
time = dateConvertMillionSec(strNow);
//获取当前时间,减去24小时。就是获取过去一天每小时的数据
long tempTime = 1000 * 60 * 60 * 24 * 15L;
start_ts = String.valueOf(time - tempTime);
for (int j = 1; j < 15; j++) {
for (int i = 1; i < 25; i++) {
calculateDataList.add(df.format(time - 1000 * 60 * 60 * j * i));
}
}
}
private long dateConvertMillionSec(String str) {
long millionSeconds = 0;
try {
millionSeconds = new SimpleDateFormat("yyyyMMddHH").parse(str).getTime();
} catch (ParseException e) {
e.printStackTrace();
}
return millionSeconds;
}
2、两个list根据时间字段合并
方法一,利用list里面带有contains方法进行字段比较。把找出来List<HistoryData> 里面没有数据;放到List<HistoryData> 里面HistoryData里面字段里面。
for (String temp : calculateDataList) {
if (!tempList.contains(temp)) {
HistoryData historyData = new HistoryData();
historyData.setDatetime(temp);
historyDataList.add(historyData);
}
}
方法二、两个for循环遍历也是可以搞定的。
for (String temp : calculateDataList) {
boolean flag = false;
for (HistoryData historyData : historyDataList) {
if (temp.equals(historyData.getDatetime())) {
flag = true;
break;
}
}
if (!flag) {
HistoryData historyData = new HistoryData();
historyData.setDatetime(temp);
historyDataList.add(historyData);
}
}
3、最后附带一个list的排序方法,按时间排序
Collections.sort(historyDataList, new Comparator<HistoryData>() {
@Override
public int compare(HistoryData temp1, HistoryData temp2) {
//可以按User对象的其他属性排序,只要属性支持compareTo方法
Integer it1 = Integer.valueOf(temp1.getDatetime());
Integer it2 = Integer.valueOf(temp2.getDatetime());
return it1.compareTo(it2);
}
});