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