IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

Requête sur un ArrayList


Sujet :

Collection et Stream Java

  1. #1
    Membre éclairé Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Par défaut Requête sur un ArrayList
    Je suis face à un dilemme et je soumet cela à votre appréciation.

    Comment faire une requête sur un ArrayList (A) afin d'obtenir dans un autre ArrayList (B) les données de l'ArrayList (A) qui respectent un critère ?

    Je m'explique.
    J'ai dans l'ArrayList (A) la liste de tous les employés d'une boîte et je voudrais avoir dans l'ArrayList (B) à partir de l'ArrayList(A) les employés du département (x) de cette boîte.

    Please help me

  2. #2
    Membre éclairé
    Inscrit en
    Février 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 38
    Par défaut
    Hello,

    soit tu utilises l'api commons-collections d'apache et t'utilise la méthode filter

    Soit tu le code toi même.
    En faisant un peu générique t'arrives à ça :

    une interface
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public interface IFilter<T> {
    	public boolean accept(T toTest);
    }
    Une classe utilitaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class ObjectCollectionUtils<T> {
    	public List<T> filter(List<T> toFilter, IFilter<T> filter) {
    		List<T> result = new ArrayList<T>();
    		for (T toTest : result) {
    			if(filter.accept(toTest))
    				result.add(toTest);
    		}
    		return result;
    	}
    }
    et ton main (ici un test sur des String a toi d'adapter avec ta classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    		IFilter<String> myFilter = new IFilter<String>() {
    			@Override
    			public boolean accept(String toTest) {
    				//test à la con 
    				if(toTest.length()<3)
    					return true;
    				return false;
    			}
    		};
    		List<String> toFilter = new ArrayList<String>();
    		toFilter.add("ab");
    		toFilter.add("abqdsfd");
    		ObjectCollectionUtils<String> objectCollectionUtils = new ObjectCollectionUtils<String>();
    		List<String> filteredList = objectCollectionUtils.filter(toFilter, myFilter);

  3. #3
    Membre éclairé Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Par défaut
    Merci super_toinou,
    Je suis entrain de chercher à comprendre le code que tu viens de fournir. Voici l'ArrayList à partir de laquelle je dois effectuer le filtrage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    public static ArrayList<employe> getListClientAS400(){
    	connexion = new BDConnectAS400();
    	String requete = "SELECT * FROM EMPLOYES ORDER BY CIDEMP";
    	Statement state;
    	ResultSet res;
    	ArrayList<employe> list = new ArrayList<employe>();
     
    	try{
    		state = connexion.getInstance().createStatement();
    		res = state.executeQuery(requete);
    		while(res.next()){
    			employe emp = new employe();
    			emp.setCDEMP(res.getString(2));//Code employé 
    			emp.setNOM(res.getString(3));//Nom
    			emp.setPRENOMS(res.getString(4));//Prénoms
    			emp.setADR1PN(res.getString(5));//Adresse 1ère partie
    			emp.setADR2PN(res.getString(6));//Adresse 2ème partie
    			emp.setVILLPN(res.getString(7));//Ville
    			emp.setNTELPN(res.getString(8));//N° de téléphone
    			emp.setNTEFPN(res.getString(9));//N° de tel Fax
    			emp.setDEPT(res.getString(10));//Département
    			list.add(emp);
    		}
    		res.close();
    		return list;
    		}catch(SQLException e){}
    		return null;
    	}
    Je voudrais pouvoir faire la même chose mais selon le département.

  4. #4
    Membre éclairé
    Inscrit en
    Février 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 38
    Par défaut
    Oulà c'est pas très joli tout ça
    Mets au moins la première lettre de tes classes en majuscule (norme Java)

    Sinon pour ton pb :
    Tu appelles ta méthode qui te file tous les employés et tu filtres
    (j te donne la trame à suivre à l'arrache)

    Crée une classe
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class DeptEmployeFilter implements IFilter<Employe>{
     
    private String validDept;
    public DeptEmployeFilter (String validDept){
    this.validDept = validDept;
    }
     
    public boolean accept(Employe toTest) {
    return validDept.equals(toTesy.getDept());
    }
    }
    Ensuite dans ton code qui appelle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    List<Employe> allEmployees = MonDAO.getListClientAS400()
    IFilter deptFilter = new DeptEmployeFilter ("serviceCompta");
    ObjectCollectionUtils<Employe objectCollectionUtils = new ObjectCollectionUtils<Employe>();
     
    List<String> filteredList = objectCollectionUtils.filter(allEmployees , deptFilter );
    C'est plus ou moins l'idée, à toi de t'adapter

    +++

  5. #5
    Membre éclairé Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Par défaut
    Encore une dernière question
    Je dois afficher les données obtenue dans un JTable. Voici comment je procédais avant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private void initClient() {
    	Thread t = new Thread(){
     
    	@Override
    	public void run() {
              lister = new ArrayList<ClientAS400>();
    	  ArrayList<employe> list  = DAOClientAS400.getListClientAS400();
    	  lister = list;
    	  table.setModel(new ClientAS400TableModel(lister));
    	   }};
    	   t.start();
    	 }
    Maintenant qu'il ya un filtrage pourrais-tu réviser ce code s'il te plaît ?

  6. #6
    Membre éclairé
    Inscrit en
    Février 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 38
    Par défaut
    J vais pas tout faire à ta place non plus.
    T as juste à filtrer ta liste avant de le passer au model

  7. #7
    Membre éclairé Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Par défaut

  8. #8
    Membre éclairé Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Par défaut
    S'il te plaît super_toinou;
    Quel est la nom de la class Java ou le jar qui permet d'obtenir :
    ObjectCollectionUtils car il n'est pas dans ma librairie. En voulant appliquer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ObjectCollectionUtils<Employe objectCollectionUtils = new ObjectCollectionUtils<Employe>();
    à mon cas j'ai des erreurs.
    Merci d'avance.

  9. #9
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 713
    Par défaut
    On peut aussi régler la question à la base :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    	String requete = "SELECT * FROM EMPLOYES WHERE DEPARTEMENT = '" + departementQueJeCherche + "' ORDER BY CIDEMP ";
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  10. #10
    Membre éclairé Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Par défaut
    Le problème est déjà régler à la base mais le truc est que lorsqu'on est confronté à une base de données mammouth comme oracle située sur un serveur distant et que la table concernée possède des milliers de ligne ... il faut se poser des questions sur le temps de réponse ou d'attente.

    Alors qu'avec cette méthode de requête sur les ArrayList, on charge la table au lancement du programme ensuite on effectue notre recherche dans les données chargées dans la list. Mon Avis

  11. #11
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 713
    Par défaut
    Comme tu voudras, mais une table comportant des milliers de lignes c'est dérisoire pour un SGBD.
    Oracle, SQL Server, MySQL etc. sont tous conçus pour répondre instantanément même si la table fait des millions de lignes.
    Je crois que tu devrais faire un essai de temps de réponse sur la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "SELECT * FROM EMPLOYES WHERE DEPARTEMENT = '91' ORDER BY CIDEMP ";
    à comparer au temps de réponse que nécessite le chargement intégral de la table dans un Arraylist puis le filtrage sur le département.
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  12. #12
    Membre Expert
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Par défaut
    Le temps de connection et de rapatriement peut être non négligeable ; la mise "en cache" de la liste complète, puis le filtrage en java est effectivement potentiellement avantageuse.

    Et pour répondre à la question, Super-Toinou t'as donné le code de la classe, tu n'as plus qu'a la mettre dans tes sources ...

Discussions similaires

  1. Réponses: 4
    Dernier message: 26/07/2011, 11h29
  2. Requête sur un MemData
    Par claude dans le forum Bases de données
    Réponses: 5
    Dernier message: 23/12/2004, 10h11
  3. Requête sur date
    Par guenfood dans le forum Access
    Réponses: 11
    Dernier message: 08/12/2004, 16h11
  4. Requête sur un serveur lié
    Par Guizz dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 06/08/2003, 11h35
  5. requête sur l'année d'une date
    Par jo77 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 30/07/2003, 09h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo