Suppression d'un message selon un seuil

Fermé
pudya - Modifié le 22 août 2017 à 20:27
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 25 août 2017 à 18:47
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

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
22 août 2017 à 21:20
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
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
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
25 août 2017 à 18:47
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