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

Java Discussion :

Interface List : inverser


Sujet :

Java

  1. #1
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 53
    Par défaut Interface List : inverser
    Je dois inverser une List (interface List) récursivement.

    Le prototype doit être : public List reverse(List liste)

    J'ai trouver sur le forum le code suivant (pas récursif)):
    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
     
    public class javaCollect{
     
        static List reverse(List liste)
        {
    	List result = new ArrayList();
    	for(int i=liste.size()-1; i>=0; i--)
    	    result.add(liste.get(i));
    	return result;
        }
     
        public static void main(String[] args)
        {
    	List liste = new ArrayList();
    	for(int i=1; i<=5; i++)
    	    liste.add("fdg"+i);
     
    	List result = reverse(liste);
    	System.out.println(result);
        }
    }
    Si je remplace le List result = new ArrayList(); par List result = new List(); ca plante.

    qqn peut il m'aider ?

  2. #2
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    Citation Envoyé par dword2add Voir le message
    Si je remplace le List result = new ArrayList(); par List result = new List(); ca plante.
    étonnant

    Citation Envoyé par dword2add Voir le message
    qqn peut il m'aider ?
    Non, on peut pas aider, regarde qu'est-ce qu'une interface et pourquoi on ne peut pas les instancier...

    List => interface, impossible à instancier
    ArrayList => implémentation concrète de l'interface List


  3. #3
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 53
    Par défaut
    d'accord une interface n'a pas de constructeur.
    Mais je me pose la question si ce code fonctionne pour toutes les classes implémentant List.

  4. #4
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    Bonjour,
    Citation Envoyé par dword2add Voir le message
    d'accord une interface n'a pas de constructeur.
    Entre autres ... c'est surtout parce qu'elle n'a pas de corps ou de code ...

    Citation Envoyé par dword2add Voir le message
    Mais je me pose la question si ce code fonctionne pour toutes les classes implémentant List.
    Non, bien sûr que non, car rien n'empêche une implémentation de List d'implémenter correctement les méthodes de List.
    Par exemple, je peux coder une implémentation de List qui ne fait que retourner 0 dans add .... ton code ne va pas fonctionner dans ce cas-ci

  5. #5
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 53
    Par défaut
    Alors comment peut on faire une méthode qui inverse une liste (pour toutes les Listes).

  6. #6
    Membre Expert

    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    2 301
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 301
    Par défaut
    A condition que les classes réelles implémentent correctement List (on dit qu'elles respectent le contrat de List), ton code fonctionnera pour n'importe quelle List (ArrayList, LinkedList, etc.)

  7. #7
    Expert confirmé
    Avatar de djo.mos
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    4 666
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 666
    Par défaut
    Bah tu l'as fait déjà: Puisque c'est toi qui choisit quelle implémentation utiliser, et que tu as choisi ArrayList qui remplit parfaitement son contrat, donc, ta méthode fonctionne sans problème.

  8. #8
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 53
    Par défaut
    Voici mon code "final" :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     
    import java.util.*;
     
    /**
     * This class implements a reverse method for the <code>List</code>. This is
     * a static method that invert the elements of the List.
     *
     * @version 1.6
     */
    public class javaCollect {
     
    	/**
             * Invert a list with recursion. Takes an element in the first list and puts
             * it at the right place in the second.
             * 
             * @param liste
             *            the list to invert
             * @param result
             *            the (partial) inverted list
             * @param level
             *            the recusrsion level (start with 1)
             * @return the inverted list
             */
    	static List reverse(List liste, List result, int level) {
    		// test if the inversion is over
    		if (level <= liste.size()) {
    			// put the new element
    			result.add(liste.get(liste.size() - level));
    			// go with the next element
    			result = reverse(liste, result, level + 1);
    		}
    		return result;
    	}
     
    	/**
             * Invert a list. This method don't modify the original list. Start the
             * recursion.
             * 
             * @param liste
             *            the list to invert
             * @return the inverted list
             */
    	static List reverse(List liste) {
    		// create the new arrayfor the element
    		// if the List liste respect the contract of the Interface => there is
    		// no problem to put the List into an ArrayList.
    		List result = new ArrayList();
    		// invert the list
    		result = reverse(liste, result, 1);
    		return result;
    	}
     
    	/**
             * A test routine for the class. Test with ArrayList, Vector, LinkedList. Do
             * a inversion with the reverse method of the java API.
             * 
             * @param args
             *            the argument from command line (empty)
             */
    	public static void main(String[] args) {
     
    		// ArrayList
    		List array = new ArrayList();
    		for (int i = 1; i <= 5; i++)
    			array.add("arrayItem" + i);
    		System.out.println(array);
    		List resultA = reverse(array);
    		System.out.println(resultA);
    		System.out.println("------------------------");
     
    		// Vector
    		List vector = new Vector();
    		for (int i = 1; i <= 5; i++)
    			vector.add("VectorItem" + i);
    		System.out.println(vector);
    		List resultV = reverse(vector);
    		System.out.println(resultV);
    		System.out.println("------------------------");
     
    		// LinkedList
    		List link = new LinkedList();
    		for (int i = 1; i <= 5; i++)
    			link.add("LinkItem" + i);
    		System.out.println(link);
    		List resultL = reverse(link);
    		System.out.println(resultL);
    		System.out.println("------------------------");
     
    		// inverse a vector with Collections.reverse();
    		List link2 = new LinkedList();
    		for (int i = 1; i <= 5; i++)
    			link2.add("Lwerweqtem" + i);
    		System.out.println(link2);
    		Collections.reverse(link2);
    		System.out.println(link2);
     
    	}
    }
    Ca marche mais le type retourné par ma fonction reverse() est ArrayList (c'est normal...).
    Je voudrais que le type de retour soit le même que celui de l'argument de reverse(List liste).

    Est ce possible ?

  9. #9
    Membre Expert Avatar de herve91
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    1 282
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 282
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    static void reverse(List liste) {
    	for (int min = 0, max = liste.size() - 1; min < max; min++, max--) {
    		Object tmp = liste.get(min);
    		liste.set(min, liste.get(max));
    		liste.set(max, tmp);
    	}
    }

  10. #10
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Euh...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    java.util.Collections.reverse(list);

  11. #11
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 53
    Par défaut
    Je dois programmer la fonction moi même et pas la prendre dans l'api.

    Sinon la fonction doit être récursive. Et le prototype doit être public List reverse(List list);.

    Donc je suis obliger de créer une nouvelle List. Mais je sais pas comment faire pour qu'elle ait le meme type que la liste passé en argument.

  12. #12
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par dword2add Voir le message
    Donc je suis obliger de créer une nouvelle List. Mais je sais pas comment faire pour qu'elle ait le meme type que la liste passé en argument.
    Tu peux utiliser la réflection pour récupérer le type de la liste en paramètre et créer une nouvelle instance. Mais comme rien ne garantie que ce soit possible pour tous les types de List tu devras quand même utilisé un type par défaut pour les cas particulier (par exemple si la List ne possède pas de constructeur vide) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	List result;
    	try {
    		// On tente de créer une nouvelle instance via la réflection
    		result = (List) list.getClass().newInstance();
    	} catch (Exception e) {
    		// Si cela échoue on utilise un type de liste par défaut
    		result = new ArrayList();
    	}

    a++

  13. #13
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Je ne sais pas si ça peut marcher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    List newList = list.clone();
    newList.clear();

  14. #14
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par natha Voir le message
    Je ne sais pas si ça peut marcher :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    List newList = list.clone();
    newList.clear();
    Malheureusement non.
    L'interface List n'étend pas Cloneable et ne redéfinit pas clone() déclaré en protected

    Il faudrait passer par de la réflection pour appeler clone().

    Mais le problème reste le même car rien ne garantit que l'implémentation de la liste soit cloneable (même si celle de l'API standard le sont).


    a++

  15. #15
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Ah ben oui évidemment.
    Répondu un peu vite, j'aurais dû tester.
    Donc ta solution est clairement la meilleure, j'y avais aussi pensé mais si clone fonctionnait ça aurait pu couvrir plus de possibilités.
    La limitation de la tienne c'est qu'il faut qu'il y ait un constructeur par défaut (même si c'est le cas assez souvent pour les List).
    On est vite embêté de toute façon par toutes les spécialités style : Collections.unmodifiableList(list), Collections.singletonList(obj), et cie...
    Il n'y a pas vraiment de solution satisfaisante à ce problème.

  16. #16
    Membre averti
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2006
    Messages : 53
    Par défaut
    C'exactement ce qu'il me fallait !!!

    Je crois que j'ai compris (ou du moins mieux) compris la copie d'objet, Merci !!!

  17. #17
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Août 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2007
    Messages : 74
    Par défaut
    List est une interface implémenter dans ArrayList et LinkedList
    ou ne peu pas l'instancier car tout simplement les interface ne contint pas des constructeur
    alors tu dois travailler sur Arraylist

Discussions similaires

  1. implementer interface list en généric
    Par goldorax113 dans le forum Langage
    Réponses: 9
    Dernier message: 16/10/2006, 12h47
  2. Liste inversée !
    Par Bydouille dans le forum Requêtes
    Réponses: 12
    Dernier message: 21/09/2006, 17h02
  3. [Conception] Liste inversée !
    Par Bydouille dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 21/09/2006, 10h23
  4. Inversion d'une liste chaînée
    Par sossomj dans le forum Pascal
    Réponses: 10
    Dernier message: 25/06/2006, 15h51
  5. [Interface Homme Machine] Liste des interactions possibles
    Par dymezac dans le forum Interfaces Graphiques en Java
    Réponses: 5
    Dernier message: 27/01/2006, 11h45

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