gpt4 book ai didi

java - 在一周的时间跨度内每天按时间戳聚合对象

转载 作者:行者123 更新时间:2023-11-30 02:47:15 31 4
gpt4 key购买 nike

我在一周的时间跨度内根据每天的时间戳聚合数据时遇到问题。有一个 SQLite 数据库,它有一个表,我在其中保存步行步数(timestamp 列是 UTC,created_At 是本地时间,但我不使用created_at 列)。

enter image description here

我想做的是获取7天前到前一天午夜发生的总数据。所以我有这个 jodatime 表达式来查找时间戳的开始和结束

long start = new DateTime().withMillisOfDay(0).minusDays(7).getMillis();
long end = new DateTime().withTimeAtStartOfDay().getMillis();
//start milli:1405029600000 DateTime: 2014-07-11 00:00:00
//end milli:1405634400000 DateTime: 2014-07-18 00:00:00

然后我执行这个sql命令:

SELECT * FROM pa_data WHERE timestamp BETWEEN 1405029600000 AND 1405634400000

而且我非常确定它会返回正确的行(我已经将 android 数据库结果与我电脑上的 SQLite 数据库浏览器进行了比较,两者都返回相同数量的行)。为此,我尝试使用这个嵌套迭代:

我要创建的对象是:

public class PhysicalActivityPerDay {

private List<PhysicalActivity> mList;

public PhysicalActivityPerDay(List<PhysicalActivity> list) {
mList = new ArrayList<PhysicalActivity>(list);
}

//methods....

}

现在的问题是,我想要一个数据对象来保存每天的行数。

List<PhysicalActivity> all = getPhysicalActivitiesBetween(start, end);
List<PhysicalActivityPerDay> perDays = new ArrayList<PhysicalActivityPerDay>();
List<PhysicalActivity> tempList;
PhysicalActivityPerDay tempPerDay;

for (int i = 0; i < 7; i++) {

long begin = start;
long stop = (begin + 86400000); //add 24 hours

tempList = new ArrayList<PhysicalActivity>();

for (int j = 0; j < all.size(); j++) {

PhysicalActivity p = all.get(j);
DateTime when = new DateTime(p.getTimestamp());

if (when.isAfter(start) && when.isBefore(stop)) {
tempList.add(p);
all.remove(j); //remove the matching object from the list
}
}

tempPerDay = new PhysicalActivityPerDay(tempList);
perDays.add(tempPerDay);

start += 86400000; //add 24 hours or 1 day for next iteration
}

return perDays;

但结果完全出乎意料。有许多行与上面的 if 语句不匹配。我进行了调试,结果如下:

Log.w(TAG, "There are totally " + all.size() + " physical activities for day for 7 days");
//There are totally 6559 physical activities for day for 7 days

但是,当我检查 all 列表(DB 返回的总行数)时,虽然我正在从中删除匹配的对象,但如果我在嵌套迭代后查询它的大小,令人惊讶的是它仍然包含许多对象在里面,告诉我迭代没有成功!

//Remaining: 3278 records after iterations from 6559

我做错了什么?请帮我找出答案!

最佳答案

不确定这是不是唯一的问题:

您正在遍历 all 列表,并删除项目。当您调用 all.remove(j) 时,原先位于位置 j+1 的项目移动到位置 j。这意味着您的 for 循环将跳过该项目。

解决此问题的一种方法是仅当您不从列表中删除项目时才增加 j。

for (int j = 0; j < all.size();) {

PhysicalActivity p = all.get(j);
DateTime when = new DateTime(p.getTimestamp());

if (when.isAfter(start) && when.isBefore(stop)) {
tempList.add(p);
all.remove(j); //remove the matching object from the list
} else {
j++;
}
}

实际上,我不完全确定此修复后循环是否会正常工作。这取决于是否在每次迭代中评估 all.size()。如果不是,它会期望列表具有初始数量的元素,即使您要删除项目也是如此。在这种情况下,您可能会在第一次尝试访问超出数组最后一个索引的索引时遇到异常。

如果遇到异常,可以用 while 循环替换循环:

Iterator<PhysicalActivity> iter = all.iterator();
while (iter.hasNext ()) {
PhysicalActivity p = iter.next();
...
if (...) {
iter.remove();
}
}

引用definition of List.remove() :

public E remove(int index)

Removes the element at the specified position in this list. Shifts any subsequent elements to the left (subtracts one from their indices).

关于java - 在一周的时间跨度内每天按时间戳聚合对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24828811/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com