每个内部的每个 - Java

时间:2011-03-23 15:21:24

标签: 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);
        }
    }
}

我的代码不会通过{}循环的第一个传递,这就是为什么idFromArray是空的,因为我没有添加任何东西,直到将tweet添加到数据库。

即使数组中有某些内容,它也会将整个内容循环两次(DUH!因为我有两个循环),这使得数据库在相同的推文中非常臃肿。

这不是两个推文id的简单比较,只是忽略具有相同ID的那些。

我很确定这个问题有一个非常简单的解决方案,但我仍然无法解决这个问题。任何人

更新

我想要的是忽略数据库中已有的tweetId的代码。 并且只需插入不在数据库中的推文。

我认为我不应该有两个for循环,我认为第二个循环应该被替换为什么? (或者我错了?)

5 个答案:

答案 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循环不会这样做。