Joa*_*rom 36 java android for-loop
for (Tweet tweet : tweets) {
for(long forId : idFromArray){
long tweetId = tweet.getId();
if(forId != tweetId){
String twitterString = tweet.getText();
db.insertTwitter(twitterString, tweetId);
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的代码将不会通过{}循环的第一个传递,这就是为什么idFromArray是空的,因为我没有添加任何内容,直到已将tweet添加到数据库.
即使数组中有某些内容,它也会将整个内容循环两次(DUH!因为我有两个循环),这使得数据库在相同的推文中非常臃肿.
这不是两个推文id的简单比较,而是简单地忽略具有相同id的那些.
我很确定这个问题有一个非常简单的解决方案,但我仍然无法解决这个问题.任何人?
更新:
我想要的是忽略数据库中已有的tweetId的代码.只需插入不在数据库中的推文.
我不认为我应该有两个for循环,我认为第二个循环应该被替换为什么?(或者我错了?)
wds*_*wds 48
如果我理解正确,你想做什么,在伪代码中如下:
for (Tweet tweet : tweets) {
if (!db.containsTweet(tweet.getId())) {
db.insertTweet(tweet.getText(), tweet.getId());
}
}
Run Code Online (Sandbox Code Playgroud)
我假设您的db类实际上使用sqlite数据库作为后端?你可以做的是containsTweet直接实现,每次只查询数据库,但这似乎不太完美.如果我们使用基本代码,最简单的解决方案就是保持Set对推文的索引.由于我不能确定看起来像什么equals()方法Tweet,我只会将标识符存储在那里.然后你得到:
Set<Integer> tweetIds = new HashSet<Integer>(); // or long, whatever
for (Tweet tweet : tweets) {
if (!tweetIds.contains(tweet.getId())) {
db.insertTweet(tweet.getText(), tweet.getId());
tweetIds.add(tweet.getId());
}
}
Run Code Online (Sandbox Code Playgroud)
通过tweets对开头的列表进行排序然后过滤掉重复的推文,可能会更好地保存这项工作的一小部分.你可以使用:
// if tweets is a List
Collections.sort(tweets, new Comparator() {
public int compare (Object t1, Object t2) {
// might be the wrong way around
return ((Tweet)t1).getId() - ((Tweet)t2).getId();
}
}
Run Code Online (Sandbox Code Playgroud)
然后处理它
Integer oldId;
for (Tweet tweet : tweets) {
if (oldId == null || oldId != tweet.getId()) {
db.insertTweet(tweet.getText(), tweet.getId());
}
oldId = tweet.getId();
}
Run Code Online (Sandbox Code Playgroud)
是的,你可以使用第二个for循环来做到这一点,但是你会比使用这种方法更快地遇到性能问题(尽管我们在这里做的是交换内存性能的时间,当然).
| 归档时间: |
|
| 查看次数: |
101918 次 |
| 最近记录: |