2017-10-14 6 views
0

J'ai une assez grande liste contenant beaucoup d'instances d'une classe, cette classe a de nombreux attributs (variables membres). Mon problème est de trouver une structure de données réalisable pour stocker ces instances qui permettent des recherches basées sur de multiples attributs comme la recherche de base de données (par exemple, une classe d'étudiants, chaque étudiant a son âge, sa date de naissance, son grade et son GPA). entre 20 et 23). La carte ne semble pas applicable car elle n'autorise qu'une seule clé et si je crée un index multi-attributs pour la recherche, le grand O n'est toujours pas diminué. J'ai également envisagé d'utiliser des arbres comme l'arbre AVL, et je ne pense pas que cela fonctionnerait.comment choisir ou écrire ma propre structure de données java permettant la recherche multi-attributs

Je serais reconnaissant si quelqu'un pouvait me donner quelques conseils.

+1

Une option consisterait à utiliser réellement une base de données. Peut-être un en mémoire un. Ou peut-être un moteur de recherche (Lucene, Solr, ElasticSearch) –

+0

pouvez-vous être plus clair sur les éléments de données dans vos besoins? –

+0

@JensSchauder Je pense vraiment avoir besoin d'une base de données, mais comme c'est une question de structure de données, je suis seulement autorisé à résoudre ce problème en mémoire en utilisant une structure de données. –

Répondre

1

Je pense que ce que vous cherchez est un Inverted Index (en utilisant le nom d'attribut + valeur en tant que clés) ou éventuellement un index inversé par attribut. Une recherche créerait l'intersection de tous les résultats trouvés pour chaque attribut.

0

Vous pouvez le faire:

  • Construire un arbre AVL avec des objets classés par l'attribut le plus récurrent (un seul, par exemple « id » ou « nom »).
  • Ensuite, créez une fonction de recherche qui au lieu de prendre une valeur, prend une expression lambda Java F (si votre condition Critères de recherche doit être quelque chose comme F(myObj) == true au lieu de myObj.deFaultAttribute == searchParameter)
  • Pour l'exemple que vous avez donné, F pourrait être quelque chose comme ((myObj) -> myObj.year==2 && myObj.age>=20 && myObj.age<=23)
J'espère que cela aide.

+1

Je crois que cela fonctionnerait mais je suis toujours confus si cela pourrait vraiment améliorer la complexité temporelle ou non, je pense qu'il n'y a aucune différence entre cette solution et l'utilisation directe d'une liste pour la recherche (excepté les recherches basées sur la clé). –