Bonjour,

je ne sais pas quels mot clefs chercher, j'espère que la question n'a pas déjà été posée (désolé sinon).
J'aurais besoin de votre aide, parce que j’ai le problème suivant :
Je veux enregistrer des informations structurés de cette manière :
- pour chaque identifiant (ex : id_client), j’ai une liste d’un type d’information (ex : td = l’horodatage de la première action du client), et pour chacune de ces premières actions, j’ai une nouvelle liste d’information (ex : tf = horodatage de la dernière action du client).

Pour chaque id_client, j’ai un/plusieurs horodatage de début td et pour chaque td, j’ai un/plusieurs horodatage de fin tf :
Nom : Capture du 2019-10-09 15-44-25.png
Affichages : 726
Taille : 10,6 Ko


Pour coder ça, j’avais au début créé trois listes distinctes
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
List<Integer> id_cl ;
List<List<Double>> td ;
List<List<List<Double>>> tf.
Mais c’était pas super pratique pour traiter les cas par exemple, où je veux supprimer un client (faut détecter quelles td correspondent à l’id_cl etc.
à la place, j’ai créé deux objets Client et TimeInfo, avec :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
List<Client> clients ;
avec*: Client{int id_cl ;  List<TimeInfo> time} ; avec : TimeInfo{double td ; List<Double> tf}
Le problème que j’ai maintenant est le suivant : comment traiter efficacement les listes, par exemple pour avoir des choses comme :
⇒ liste des "tf" pour un client particulier ;
⇒ liste des "tf" de tous les clients ;
A chaque fois, je fais des boucles « for » mais je pense que c’est très cher en calcul.
Par exemple je fais :
⇒ liste des tf pour un client particulier id_cl = 1 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
List<Double> tf_list = new Arraylist<Double>() ;
for (int ti = 0; ti< clients.get(id_cl).getTimeInfo().size() ; ti++)
{
   for (int tfi = 0:tfi<clients.get(id_cl).getTimeInfo().get(ti).getTFinal().size();tfi ++)
  {
	  tf.add(clients.get(id_cl).getTimeInfo().get(ti).getTFinal().get(tfi)); 
  }
}
}
Une solution que je n’aime pas, serait de créer à la fois les listes et les objets :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
List<Client> id_cl;
List<List<Double>> td;
List<List<List<Double>>> tf.
Client{int id_cl ;  List<TimeInfo> time}, avec : TimeInfo{double td ; List<Double> tf}
Et où les listes td/tf seraient mis à jour à chaque insertion et recréé à chaque délétion, mais je ne suis pas convaincue de ce qui est le mieux (listes + objets = cher en mémoire ; objets seuls = cher en parcourt de listes).

Auriez vous des recommandations ?
Y a t’il un autre moyen ? Notamment, je cherche quelque chose du type :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
clients.get(:).getTimeInfo().get(:).getFinalTime()
, où « : » traiterait tous les cas, sans avoir besoin de tout reparcourir par une boucle.

Merci!



[EDIT] : j'ai trouvé les lambda expressions pour avoir par exemple :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
list.forEach(System.out::println);
mais même si c'est plus agréable à lire, il me semble que c'est tout aussi cher en calcul qu'une boucle, non ?