for (Tweet tweet : tweets) {
for(long forId : idFromArray){
long tweetId = tweet.getId();
if(forId != tweetId){
String twitterString = tweet.getText();
db.insertTwitter(twitterString, tweetId);
}
}
}
我的代码不会通过{}循环的第一个传递,这就是为什么idFromArray是空的,因为我没有添加任何东西,直到将tweet添加到数据库。
即使数组中有某些内容,它也会将整个内容循环两次(DUH!因为我有两个循环),这使得数据库在相同的推文中非常臃肿。
这不是两个推文id的简单比较,只是忽略具有相同ID的那些。
我很确定这个问题有一个非常简单的解决方案,但我仍然无法解决这个问题。任何人
更新
我想要的是忽略数据库中已有的tweetId的代码。 并且只需插入不在数据库中的推文。
我认为我不应该有两个for循环,我认为第二个循环应该被替换为什么? (或者我错了?)
答案 0 :(得分:47)
如果我理解正确,你想做什么,在伪代码中如下:
for (Tweet tweet : tweets) {
if (!db.containsTweet(tweet.getId())) {
db.insertTweet(tweet.getText(), tweet.getId());
}
}
我假设您的db类实际上使用sqlite数据库作为后端?你可以做的是直接实现containsTweet
,每次只查询数据库,但这似乎不太完美。如果我们使用基本代码,最简单的解决方案就是保持Set
围绕索引编制索引。由于我无法确定equals()
的{{1}}方法是什么样的,我只会将标识符存储在那里。然后你得到:
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());
}
}
列表进行排序然后过滤掉重复的推文,最好保存一点这项工作。你可以使用:
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();
}
}
是的,你可以使用第二个for循环来做到这一点,但是你会比使用这种方法更快地遇到性能问题(尽管我们在这里做的是交换存储器性能的时间,当然)。
答案 1 :(得分:3)
您的语法不正确。它应该是这样的:
for (Tweet tweet : tweets) {
for(long forId : idFromArray){
long tweetId = tweet.getId();
if(forId != tweetId){
String twitterString = tweet.getText();
db.insertTwitter(twitterString);
}
}
}
此答案不再真正回答问题,因为它已更新;)
答案 2 :(得分:0)
最简单的解决方案是设置布尔变量。如果为true,则执行insert语句,然后在outter循环中检查此项并在布尔值为true时插入推文...
答案 3 :(得分:0)
for (Tweet : tweets){ ...
应该是
for(Tweet tweet: tweets){...
答案 4 :(得分:0)
所以你真的想要:
for each tweet
unless tweet is in db
insert tweet
如果是这样,请用您的编程语言写下来。 提示:数组上的循环将在插入之前完成,这取决于结果。
您要测试的是所有数组元素不等于当前的数组元素。但你的for循环不会这样做。