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