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 régulier Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Points : 123
    Points
    123
    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
    L'important n'est pas de tout savoir mais de savoir où tout se trouve !

  2. #2
    Membre du Club
    Inscrit en
    Février 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 38
    Points : 52
    Points
    52
    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 régulier Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Points : 123
    Points
    123
    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.
    L'important n'est pas de tout savoir mais de savoir où tout se trouve !

  4. #4
    Membre du Club
    Inscrit en
    Février 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 38
    Points : 52
    Points
    52
    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 régulier Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Points : 123
    Points
    123
    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 ?
    L'important n'est pas de tout savoir mais de savoir où tout se trouve !

  6. #6
    Membre du Club
    Inscrit en
    Février 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 38
    Points : 52
    Points
    52
    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 régulier Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Points : 123
    Points
    123
    Par défaut
    L'important n'est pas de tout savoir mais de savoir où tout se trouve !

  8. #8
    Membre régulier Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Points : 123
    Points
    123
    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.
    L'important n'est pas de tout savoir mais de savoir où tout se trouve !

  9. #9
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    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 710
    Points : 4 791
    Points
    4 791
    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 régulier Avatar de the watcher
    Inscrit en
    Juillet 2003
    Messages
    356
    Détails du profil
    Informations forums :
    Inscription : Juillet 2003
    Messages : 356
    Points : 123
    Points
    123
    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
    L'important n'est pas de tout savoir mais de savoir où tout se trouve !

  11. #11
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    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 710
    Points : 4 791
    Points
    4 791
    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 chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    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