Suppression d'un message selon un seuil

pudya -  
KX Messages postés 19031 Statut Modérateur -
Bonjour,
je souhaite une aide. en effet , je veux supprimer le message qui a une taille(12) supérieure ou égale à un seuil(8) de taille et il a la plus petite durée de vie(7).
quand j'exécute mon programme, c'est le message de faible durée de vie qui est supprimé(taille-4 et vie 6).
voilci le programme

public static ArrayList<Message> messagedetaillesupérieureouegaleauseuil(ArrayList<Message> msgTy, int seuil){
   
   System.out.println("supprimer le message de taille sup au seuil");
      
      ArrayList<Message> result2 = new ArrayList<Message>();

      int i= 0;
      
     while ( (msgTy.get(i).size <= seuil) && i < msgTy.size()) {
      
      if (msgTy.get(0).size < seuil)
      {
     result2.add(msgTy.get(i));
     i++;
      }else{
       msgTy.remove(0);
     
       }
      }
     
     result2.add(msgTy.get(0));msgTy.remove(0);
             
     return result2;
}


les données avant sont(les messages sont ordonnés suivant la colonne -2):
4 6
12 7
11 8
11 9
11 9
13 10
24 11
11 14
6 15


le résultat, alors qu'il faut supprimer 12 étant donné que le seuil est 8
12 7
11 8
11 9
11 9
13 10
24 11
11 14
6 15

1 réponse

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    Bonjour,

    Nul part dans ta méthode tu n'utilises la durée de vie, c'est comme si elle n'existait pas pour le calcul, alors que tu en as besoin...

    Remarque : quand on a besoin de filtres avancés comme celui-ci, il ne faut pas chercher à faire une méthode trop spécifique, il vaut mieux écrire une méthode plus générale qui s'appuie sur un paramètre qui pilotera le traitement selon les spécificités.

    Exemple :

    /**
     * @param collection
     *            un ensemble de valeurs
     * @param retainFirst
     *            entre deux valeurs : renvoie true si c'est le premier élément qui est à conserver, false si c'est le deuxième (qui peut être null si aucun élément n'est encore supprimable)
     * @return l'ensemble des valeurs de départ avec une valeur en moins (sauf si aucun élément n'est supprimable)
     */
    public static <E> List<E> deleteOne(Collection<E> collection, BiPredicate<E, E> retainFirst) {
        List<E> result = new ArrayList<>(collection.size());
        E toDelete = null;
    
        for (E element : collection) {
            if (retainFirst.test(element, toDelete)) {
                result.add(element);
            } else {
                if (toDelete != null) {
                    result.add(toDelete);
                }
                toDelete = element;
            }
        }
    
        return result;
    }

    Dans ton cas, cela donnerait :

    public static List<Message> messagesDeTailleSuperieureOuEgaleAuSeuil(List<Message> msgTy, int seuil)
     {
        return deleteOne(msgTy, (toAdd, toDelete) -> toAdd.size < seuil || toDelete != null && toAdd.life > toDelete.life);
    }
    0
    1. pudya
       
      bonjour KX,

      quand j'exécute le programme ci-dessous, je reçois un message d'erreur.

      public static ArrayList<Message> deleteOne(ArrayList <Message> msgTy, int seuil){
        
        System.out.println("supprimer message de taille sup au seuil et faible ttl");
        
        ArrayList<Message> result2 = new ArrayList<Message>();
        
        for (int i=0;i<msgTy.size(); i++);
        {
         deleteOne(msgTy, (toAdd, toDelete) ->
         msgTy.get(i).size < seuil || toDelete != null && msgTy.get(i).Ttl > toDelete.Ttl);
        
           }
      
        return deleteOne(msgTy, ( msgTy.get(i).size, toDelete)); 
          //-> (msgTy.get(i).size < seuil || msgTy.get(i) != null && msgTy.get(i).Ttl > msgTy.get(i).Ttl));
        
        return result2;
        }


      les messages sont ordonnés selon la durée

      Trie de la liste par durée de vie
      Taille :4 Duree :6
      Taille :12 Duree :7
      Taille :11 Duree :8
      Taille :11 Duree :9
      Taille :11 Duree :9
      Taille :13 Duree :10
      Taille :24 Duree :11
      Taille :11 Duree :14
      Taille :6 Duree :15


      avant application
      4 6
      12 7
      11 8
      11 9
      11 9
      13 10
      24 11
      11 14
      6 15


      les erreurs

      Exception in thread "main" java.lang.Error: Unresolved compilation problem: 
      Syntax error on token ",", . expected
      at applications1.Test1.deleteOne(Test1.java:164)
      at applications1.Test1.main(Test1.java:119)
      0
    2. KX Messages postés 19031 Statut Modérateur 3 020
       
      Bonjour,

      Ça n'a pas de sens d'exécuter un programme qui ne compile pas... au mieux ça exécutera le dernier code qui a correctement compilé mais ça ne reflétera pas tes dernières modifications.

      Sinon pour l'erreur en elle même, c'est que tu n'as pas su copier-coller correctement le code que je t'ai fourni.

      deleteOne(msgTy, (toAdd, toDelete) -> msgTy.get(i).size < seuil || toDelete != null && msgTy.get(i).Ttl > toDelete.Ttl);

      Tu ne devrais pas faire intervenir
      msgTy
      dans le calcul de la condition qui ne devrait dépendre que de toAdd et toDelete.

      Comme je l'avais fait avec :
      deleteOne(msgTy, (toAdd, toDelete) -> toAdd.size < seuil || toDelete != null && toAdd.life > toDelete.life);


      Evidemment je ne pouvais pas deviner que ta durée de vie s'appelait
      Ttl
      puisqu'elle n'apparaissait pas dans ton code, moi j'ai mis
      life
      mais il n'y a que ça à changer...

      deleteOne(msgTy, (toAdd, toDelete) -> toAdd.size < seuil || toDelete != null && toAdd.Ttl > toDelete.Ttl);


      De plus je ne sais pas pourquoi tu veux mettre une boucle sur msgTy alors qu'elle est déjà gérée par ma méthode.

      Quant à ton erreur de compilation :
      return deleteOne(msgTy, ( msgTy.get(i).size, toDelete)); 

      Aucune variable en Java ne peut s'écrire avec une combinaison
      (a, b)
      .
      Donc
      (msgTy.get(i).size, toDelete)
      est faux, je ne sais même pas ce que tu as essayé de faire ici...
      0