Suppression d'un message selon un seuil
pudya
-
KX Messages postés 19031 Statut Modérateur -
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
les données avant sont(les messages sont ordonnés suivant la colonne -2):
le résultat, alors qu'il faut supprimer 12 étant donné que le seuil est 8
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
-
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); }-
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 vieTaille :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 application4 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) -
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 intervenirmsgTy
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'appelaitTtl
puisqu'elle n'apparaissait pas dans ton code, moi j'ai mislife
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...
-