每个内部的每个 - Java

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循环来做到这一点,但是你会比使用这种方法更快地遇到性能问题(尽管我们在这里做的是交换内存性能的时间,当然).