[Collections]Implémenter une recherche multi-critère performante
Bonjour,
J'ai une collection de d'instance classes par ex une collection de dogs que je dois stocker dans un conteneur, et je voudrais pouvoir ensuite rechercher sur les attributs (searchDogByDogName, searchDogByDogColor, searchDogByOwnerName).
public class dog {
private String name;
private String Color;
private String OwnerName;
}
Pour faire ça, je pense à la strategie suivante, est-ce que qqu'un peut me dire ce qu'il en pense ?
Je pense developper une classe DogContainer, dans laquelle je vais gerer 3 multimap (name, dog), (Color, dog), (OwnerName, dog) et ensuite chaque methode de search ira rechercher dans la bonne map, suivant le critere.
Je pense que faire comme ça devrait marcher, mais j'ai plein d'autres classes que je dois aussi stocker dans un conteneur et faire de la recherche multi-critere. QQu'un aurait une idee d'implementation generique ?
Re: collections : recherche performante multi-critere.
Salut,
Citation:
Envoyé par ppaul127
Pour faire ça, je pense à la strategie suivante, est-ce que qqu'un peut me dire ce qu'il en pense ?
Ca pourrait faire l'affaire si tu as peu de critère... Sinon cela devient vite complexe à gérer...
De plus ton objet conteneur est très lié avec son contenu puisque dès ue tu modifies ton objet Dog tu te retrouvera obligé de modifier ton DogContainer...
Si tu as vraiment beaucoups d'éléments ce sera peut-être un peu plus performant (quoique je n'en suis pas sur).
Citation:
Envoyé par ppaul127
Je pense que faire comme ça devrait marcher, mais j'ai plein d'autres classes que je dois aussi stocker dans un conteneur et faire de la recherche multi-critere. QQu'un aurait une idee d'implementation generique ?
Tu peux utiliser un principe proche des Filtres de recherche de fichier de la classe File, par exemple avec un interface qui définit la méthode du filtre :
Code:
1 2 3
| public interface SearchFilter {
public boolean accept(Object object);
} |
La méthode accept() renvoit true si l'objet correspond au critère...
Ensuite il suffit d'utiliser une méthode statique qui parcourt toutes la collection et qui utilise ce filtre pour créer une nouvelle collection (le résultat) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| public static Collection search (Collection collection, SearchFilter filter) {
Collection result = new ArrayList();
Iterator iterator = collection.iterator();
while (iterator.hasNext()) {
Object o = iterator.next();
if (filter.accept(o)) {
result.add(o);
}
}
return result;
} |
Il te suffit de coder ensuite les trois SearchFilter afin de gérer les divers types de recherche...
L'avantage c'est que tu peux utiliser un collection simple, avec n'importe quel type d'objet. Il te suffit juste d'implémenter les filtres de recherche selon tes besoins...
a++