Подтвердить что ты не робот

Для каждого внутри a для каждого - Java

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! Так как у меня две петли), что делает базу данных очень раздутой с теми же твитами.

Это не просто сравнение двух твитов id и просто игнорируйте те, у которых один и тот же идентификатор.

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

UPDATE:

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

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

4b9b3361

Ответ 1

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

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

Я предполагаю, что ваш класс 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());
    }
}

Вероятно, было бы лучше сохранить крошечный бит этой работы, отсортировав список 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-loop, но вы столкнетесь с проблемами производительности гораздо быстрее, чем с этим подходом (хотя то, что мы здесь делаем, это время торговли для производительности памяти, конечно).

Ответ 2

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

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

ИЗМЕНИТЬ

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

Ответ 3

самым простым решением было бы установить булевский var. if to true, где вы делаете инструкцию insert, а затем в петле outter проверяете это и вставляете там твит, если логическое значение true...

Ответ 4

for (Tweet : tweets){ ...

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

for(Tweet tweet: tweets){...

Ответ 5

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

for each tweet
    unless tweet is in db
        insert tweet

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

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