Для каждого внутри 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, я думаю, что второй цикл должен быть заменен чем-то? (или, может быть, я ошибаюсь?)

5 ответов

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

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());
 }
}
</integer></integer>

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


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

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

ИЗМЕНИТЬ

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


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


for (Tweet : tweets){ ...

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

for(Tweet tweet: tweets){...


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

for each tweet
 unless tweet is in db
 insert tweet

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

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

licensed under cc by-sa 3.0 with attribution.