для каждого внутри для каждого - Java - PullRequest
34 голосов
/ 23 марта 2011
for (Tweet tweet : tweets) {                
    for(long forId : idFromArray){
        long tweetId = tweet.getId();
        if(forId != tweetId){
            String twitterString = tweet.getText();
            db.insertTwitter(twitterString, tweetId);
        }
    }
}

Мой код не будет проходить первый цикл {}, поэтому idFromArray пуст, поскольку я ничего не добавляю туда, пока твит не добавлен в базу данных.

И даже если что-то есть в массиве, оно дважды зацикливает все это (DUH! Так как у меня есть два цикла), что делает базу данных очень раздутой с одинаковыми твитами.отправляйте твиты и просто игнорируйте их с одинаковым идентификатором.

Я почти уверен, что есть действительно простое решение этой проблемы, но я все еще не могу обернуться вокруг него.Кто-нибудь?

ОБНОВЛЕНИЕ:

Я хочу, чтобы код игнорировал идентификатор tweetId, который уже находится в базе данных.И просто вставьте твиты, которых нет в базе данных.

Я не думаю, что у меня должно быть два цикла for, я думаю, что второй цикл должен быть заменен чем-то?(а может я и не прав?)

Ответы [ 5 ]

47 голосов
/ 23 марта 2011

Если я правильно понимаю, что вы хотите сделать, в псевдокоде следующее:

for (Tweet tweet : tweets) {
    if (!db.containsTweet(tweet.getId())) {
        db.insertTweet(tweet.getText(), tweet.getId());
    }
}

Я полагаю, ваш класс БД фактически использует базу данных 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());
    }
}

Вероятно, было бы лучше сохранить небольшую часть этой работы, отсортировав список 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();
    }
}

Затем обработать его

Integer oldId;
for (Tweet tweet : tweets) {
    if (oldId == null || oldId != tweet.getId()) {
        db.insertTweet(tweet.getText(), tweet.getId());
    }
    oldId = tweet.getId();
}

Да, вы можете сделать это, используя второй цикл for, но вы столкнетесь с проблемами производительности гораздо быстрее, чемс этим подходом (хотя, конечно, мы торгуем временем на производительность памяти).

3 голосов
/ 23 марта 2011

Ваш синтаксис неверный.Должно быть так:

for (Tweet tweet : tweets) {              
    for(long forId : idFromArray){
        long tweetId = tweet.getId();
        if(forId != tweetId){
            String twitterString = tweet.getText();
            db.insertTwitter(twitterString);
        }
    }
}

РЕДАКТИРОВАТЬ

Этот ответ больше не отвечает на вопрос с момента его обновления;)

0 голосов
/ 23 марта 2011

Итак, вы действительно хотите:

for each tweet
    unless tweet is in db
        insert tweet

Если это так, просто запишите это на своем языке программирования.Подсказка: цикл над массивом должен быть выполнен до вставки, что делается в зависимости от результата.

То, что вы хотите проверить, это то, что все элементы массива не равны текущему.Но ваш цикл for этого не делает.

0 голосов
/ 23 марта 2011
for (Tweet : tweets){ ...

действительно должно быть

for(Tweet tweet: tweets){...
0 голосов
/ 23 марта 2011

самое простое решение - установить логическое значение var. если true, где вы делаете оператор вставки, а затем в цикле outter проверьте это и вставьте туда твит, если логическое значение истинно ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...