web-dev-qa-db-fra.com

pour chacun dans un pour chacun - Java

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

Mon code ne fonctionnera pas passer la première boucle de {}, c'est pourquoi idFromArray est vide car je n'y ajoute rien tant qu'un Tweet n'est pas ajouté à la base de données.

Et même s'il y a quelque chose dans le tableau, il boucle le tout deux fois (DUH! Puisque j'ai deux boucles), ce qui rend la base de données très gonflée avec les mêmes tweets.

Ce n'est pas une simple comparaison de l'id des deux tweets et ignorez simplement ceux qui ont le même id.

Je suis assez certain qu'il existe une solution très simple à ce problème, mais je ne peux toujours pas m'en occuper. N'importe qui?

MISE À JOUR:

Ce que je veux, c'est que le code ignore le tweetId qui se trouve déjà dans la base de données. Et insérez simplement les tweets qui ne sont pas dans la base de données.

Je ne pense pas que je devrais avoir deux boucles for, je pense que la deuxième boucle devrait être remplacée par quelque chose? (ou peut-être que je me trompe?)

34
Joakim Engstrom

Si je comprends bien, ce que vous voulez faire, en pseudo-code est le suivant:

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

Je suppose que votre classe db utilise en fait une base de données sqlite comme backend? Ce que vous pourriez faire, c'est implémenter containsTweet directement et simplement interroger la base de données à chaque fois, mais cela semble loin d'être parfait. La solution la plus simple si nous nous appuyons sur votre code de base est de simplement garder un Set autour de celui qui indexe les tweets. Comme je ne peux pas être sûr de ce à quoi ressemble la méthode equals() de Tweet, je vais juste y stocker les identifiants. Vous obtenez alors:

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

Il serait probablement préférable d'enregistrer un tout petit peu de ce travail, en triant la liste de tweets pour commencer, puis en filtrant simplement les tweets en double. Vous pouvez utiliser:

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

Ensuite, traitez-le

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

Oui, vous pouvez le faire en utilisant une deuxième boucle for, mais vous rencontrerez des problèmes de performances beaucoup plus rapidement qu'avec cette approche (bien que ce que nous faisons ici soit un échange de temps pour les performances de la mémoire, bien sûr).

47
wds

Votre syntaxe n'est pas correcte. Ça devrait être comme ça:

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

MODIFIER

Cette réponse ne répond plus vraiment à la question depuis sa mise à jour;)

3
RoflcoptrException

la solution la plus simple serait de définir une variable booléenne. si à true où vous faites l'instruction d'insertion puis dans la boucle extérieure, vérifiez cela et insérez le Tweet là si le booléen est vrai ...

0
Tobias
for (Tweet : tweets){ ...

devrait vraiment être

for(Tweet tweet: tweets){...
0
mkvcvc

Vous voulez donc vraiment:

for each Tweet
    unless Tweet is in db
        insert Tweet

Si oui, écrivez-le simplement dans votre langage de programmation. Astuce: La boucle sur le tableau doit être effectuée avant l'insertion, ce qui est fait en fonction du résultat.

Ce que vous voulez tester, c'est que tous les éléments du tableau ne sont pas égaux à ceux en cours. Mais votre boucle for ne fait pas cela.

0
Ingo