Filtrer, mettre en cache ou maper, ou trier un iterateur

Soyez le premier à donner votre avis sur cette source.

Vue 8 908 fois - Téléchargée 196 fois

Description

le titre est incorrect, mais si j'avais voulu mettre dans le titre tout ce que fait cette source, j'aurais probablement fait un titre beaucoup trop long...

cette source contient quelques Exceptions personalisees, quelques interfaces, deux fonctions et une trentaine de classes (peut-etre plus)

des classes pour "agreer" un tableau en iterator.

une Stack

un arbre binaire

une classe (Comparator) pour gerer des criteres de comparaisons d'objets comparables (c'est pas tres clair...)
exemple : vous avez des fichiers, vous voulez les trier, mais pour les trier, vous devez pouvoir comparer deux a deux ces fichiers.
Votre critere de tri n'est pas un simple critere, vous voulez trier par type : dossier, fichier, etc... puis par nom.
C'est la que ma classe intervient : soit vous faites deux tris successifs, ce qui rend votre tri lent... soit vous faites un tri, mais avec des criteres de tris composes. c'est a ca que sert cette classe.

Ensuite, on a la classe qui trie vraiment, elle effectue un tri par insertion dans un arbre de recherche. c'est un tri en n * log(n) sur une liste non triee, mais en n*n sur une liste triee.

j'ai quelques classes qui gerent les fichiers et dossiers unix, (fichier permissions, fichiers, dossiers, dossiers recursifs)

j'ai une classe de filtre : elle prend un iterateur, et ne renvoie que les valeurs de cet iterateur qui satisfont une propriete. (ici aussi, on peut composer ces proprietes, grace a un FiltreParam)

un iterateur qui liste recursivement l'iterateur qu'on lui passe en parametre (pour des dossiers par exemple)

un OrderedIt qui redefinit les clefs de l'iterateur.

un dynamicIt qui memorise dans un cache (array) les valeurs de l'iterateur qu'il liste, ce qui fait que le second acces a l'iterateur se trouve (parfois) etre plus rapide

une classe Seg qui represente un segment de IR (en math) [a, b]

une classe PaginateIt qui decoupe un morceau d'iterateur (par exemple, on peut prendre des valeurs de 5 a 15)

une classe ReverseIterator qui lit un iterateur a l'envers

et une classe MapIterator qui applique une fonction aux elements d'un iterateur

j'ai fait un truc que les haskelliens aiment bien : le mode paresseux. c'est a dire que si vous n'appellez pas current, alors pour certains iterateurs, les calculs ne sont pas faits (map, filter, dynamic, etc...)

Source / Exemple :


try{
  /*$i = new TestIt();
  foreach ($i as $indice => $val){
    echo $indice.' '.$val.'
';
  }*/

  /*
  $d=new DossierRec(new Factory(), './');
  $d=new Filterit($d, new FiltreParam(UnixFile::IsHidden, FiltreParam::Non));
  $d=new Recurit($d);
  $d=new SortItterator($d, new Comparator(UnixFile::Type | UnixFile::Asc, new Comparator(UnixFile::Name)));
  $d=new OrderedIt($d);
  $d=new dynamicIt($d);

  echo '<ul>';
  foreach ($d as $i=>$f)
    echo '<li>'.$i.' ) '.$f.'</li>';
  echo '</ul>';

  • /
$s=new Syracuse(45); $s=new Filterit($s, Integer::IsPaire); $s=new PaginateIt($s, new Seg(3, 13)); $s=new PaginateIt($s, new Seg(1, 10)); $s=new MapIterator($s, 'neg', MapIterator::Appl | MapIterator::Meth); //$s=new ReverseIterator($s); echo '<ul>'; foreach ($s as $k=>$c){ echo '<li>'.$k.' ==> '.$c.'</li>'; } echo '</ul>'. count($s); /* $s=new Stack(); $s->push(1); $s->push(2); $s->push(3); echo '<ul>'; foreach ($s as $k=>$c){ echo '<li>'.$k.' ==> '.$c.'</li>'; } echo '</ul>';
  • /
}catch (MException $e){ echo $e; } ?>

Conclusion :


je trouvais la SPL trop peu souple pour les dossiers, voila un recode qui corrige tout ca.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

coucou747
Messages postés
12336
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
26 -
c'etait essentiellement pour la factory du listeur de dossiers.
setFileClass (string class_name="SplFileObject")
setInfoClass (string class_name="SplFileInfo")

t'as juste ca, mais tu ne peux pas mettre de factory, or perso, j'ai des classes qui lisent les attributs de mes fichiers (lire les tags d'un mp3, le type d'un fichier source, la playliste d'un m3u, les exif d'une image, les donnees d'un ini, de quoi lire un csv, etc...) et pour la classe de la SPL, on ne peut pas distinguer un .mp3 d'un .ini... (sauf en faisant des filterIterators)

on en avait deja parle sur le forum il y a quelques temps.

pour le reste, ils n'ont pas de classe abstraite Proxy, qui soit parente a map, filter, limit, et recursive.

ils ne font pas la distinction entre les iterateurs finnis et infinis.

Ensuite, perso j'aime bien l'idee que ca soit les elements qui soient filtrables ou non, et pas l'iterateur qui filtre n'importe quoi avec un callback (ou non d'ailleur)
idem pour le tri.
malalam
Messages postés
10918
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17 -
Hello coucou,

même si, pour être franc, je comprends mal pourquoi tu as décidé de réécrire la SPL (à mon avis tu devrais l'expliquer, d'ailleurs), c'est quand même un boulot énorme. Et c'est très bien codé; Bravo :-) 10.
Morphinof
Messages postés
261
Date d'inscription
vendredi 20 avril 2007
Statut
Membre
Dernière intervention
9 août 2013
3 -
Vi c'est sur, le mieu restant l'arbre binaire équilibré pour arriver à N*log(N), mais bon N*N c'est un complexité acceptable sauf si on traite vraiment beaucoup de données ^^
coucou747
Messages postés
12336
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
26 -
throw new OMGException();
:) localstone va se regaler avec mes conventions de nomages XD

Morphinof, c'est un truc assez interessant cet arbre de recherche, mais pour les perfs, je ne suis pas sur qu'il soit si bon... car en generale, on traite des listes quasiment triees, et pour une liste triee, il est en N*N... (le Qsort est en N * log(N) )
Morphinof
Messages postés
261
Date d'inscription
vendredi 20 avril 2007
Statut
Membre
Dernière intervention
9 août 2013
3 -
Je chipotes ;)
if(!function_exists($a)) throw new blablala ^^
En tout cas je me régales je vais certainement utiliser l'arbre binaire :)

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.