Possibilités Java, types et tableaux [Résolu]

Messages postés
19
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
12 avril 2008
- - Dernière réponse : alahassarodriguez
Messages postés
19
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
12 avril 2008
- 12 avril 2008 à 15:55
Bonjour,

Pourrait on implémenter une fonction(une seule sans surcharge de fonctions) en java qui puisse recevoir un tableau en paramètres et renvoyer true dans le cas toutes les valeurs du tableau sont identiques, et renvoyer false dans l'autre cas.



Nb: quelque soit le type de variables, et ce en java


slashrod
Call it a Clan, call it a Network, call it a Tribe, call it a Family. Whatever you call it, whoever you are, you need one
(Jane Howard)
Afficher la suite 

10 réponses

Meilleure réponse
Messages postés
15815
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
83
3
Merci
Salut,

coucou : en effet, les types primitifs ne peuvent pas (à ma connaissance) être utilisés dans les generics, mais rien n'empêche d'utiliser la classe rattachée (plus lent, certes, mais ca passe).

[auteur/ALAHASSARODRIGUEZ/1026389.aspx alahassarodriguez]: Concernant le equals, c'est une bonne pratique de le redéfinir dès qu'on fait un bean (ainsi que le hashCode). Eclipse permet de générer automatiquement ces fonctions, je pense que netbeans aussi. Ces fonctions sont plus qu'utile, car sans cà, java ne peux pas comparer 2 instances de classes différentes correctement ni les placer dans une table de hachage de façon optimisé !
______________________________________
DarK Sidious

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 218 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cs_DARKSIDIOUS
Messages postés
12336
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
29
0
Merci
bonjour

ca fait partie des problemes du java
tu peux faire une fonction qui traite un object[], et utilise la methode equals, mais t'as aucun moyen de traiter un int[] ou un char[] aussi bien qu'un string[] sans faire differentes fonctions.
Commenter la réponse de coucou747
Messages postés
15815
Date d'inscription
jeudi 8 août 2002
Statut
Modérateur
Dernière intervention
4 mars 2013
83
0
Merci
Salut,

Ce n'est pas tout à fait vrai coucou : il est possible de faire une classe générics avec un tyep T, puis faire une fonction qui prend en paramètre un tableau de type T.

Ou encore, faire une fonction qui prend un ArrayList, plutôt qu'un tableau de type, et ainsi pouvoir traîter n'importe quel type d'objets (c'est objets devant redéfinir le equals, je le rappelle !).
______________________________________
DarK Sidious
Commenter la réponse de cs_DARKSIDIOUS
Messages postés
19
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
12 avril 2008
0
Merci
Merci pour vos réponses. Je vais essayer pour le générics.

Bonne journée
Commenter la réponse de alahassarodriguez
Messages postés
19
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
12 avril 2008
0
Merci
Je suis arrivé à créer ma classe qui gère les types génériques.
Seul problème encore, je n'arrive pas encore à implémenter ma fonction qui recevra un tableau de n'importe quel type(notament int).

Voici l'erreur que j'ai:

The method IsIdentique(ArrayList) in the type Test.Identique is not applicable for the arguments (int[])
Commenter la réponse de alahassarodriguez
Messages postés
19
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
12 avril 2008
0
Merci
Je suis désolé pour le spam(plusieurs messages vides, mais c'est pas de ma faute, je ne comprends pas pourquoi ça marche pas!)

Avec le code suivant:

package test;

import java.util.ArrayList;

public class Test {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub

boolean reponse;

Identique test = new Identique();

test.SetElement(new int[]{1,2,3});

reponse = test.IsIdentique(new int[]{1,2,3});//ici se trouve l'erreur

System.out.println(reponse);

}

public class Identique <E>
{
private E element;

public void SetElement(E x)
{
element=x;
}

public E GetElement()
{
return element;
}

public boolean IsIdentique(ArrayList<E> x)

{
E firstValue = x.get(0);

for (E e : x) {
if(!e.equals(firstValue))
return false;

}

return true;
}
}


}

Et je n'arrive pas non plus à déclarer une variable de la manière suivante.
Identique test = new Identique();

L'erreur générée est la suivante: Syntax error on token "int", Dimensions expected after this token

Sauriez vous me donner un peu d'éclaircissement? Merci.
Commenter la réponse de alahassarodriguez
Messages postés
12336
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
29
0
Merci
Darksidious
public class Main {

    public static void main(String[] args) {

        java.util.ArrayList a;

    }

}

ceci compile parfaitement bien, tandis que :
public class Main {

    public static void main(String[] args) {

        java.util.ArrayList a;

    }

}

ceci ne compile pas...
/home/....Main.java:31: unexpected type

found   : int

required: reference

        java.util.ArrayList a;

pensant que le probleme vennait de la class ArrayList (mais en Cpp, il me l'aurait dit directement..) j'ai teste avec :
public class Main<E> {

    public static void main(String[] args) {

        Main a;

    }

}

force est de constater qu'on ne peut toujours pas y passer de type de base... et pour des constantes, on est pas pret d'y arriver...

La raison ? En Cpp, les templates portent leurs noms, ce sont des modeles appliques a la compilation de fait, si on compile map<string, int> et map<string, string>, on aura deux classes de compilees, pourtant on a qu'une template map. En java, les generiques portent leurs noms aussi, ce sont des classes qui peuvent prendre n'importe quel _objet_, elles ne sont compiles qu'une fois, le compilateur se contente de verifier le typage (d'ailleur on est meme pas oblige de specifier le type...), et ensuite, il compile ca comme un Object... Ce qui explique que :
public class Main<E> {

    public static void main(String[] args) {

        Main a;

    }

}

compile aussi...

c'est ce que j'en avais compris en tout cas...
Commenter la réponse de coucou747
Messages postés
19
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
12 avril 2008
0
Merci
Sur ce coup là, tu ne te trompes pas.
Si j'ai bien compris vos réponses précédentes,
1- devrais je conclure que l'on ne peut avoir le résultat escompté avec les types primitifs?
2- Faudrait il encore redéfinir toutes les méthodes "equals" de tous les types d'objets pour lesquels la fonction devra être utilisée?
3- C'est à dire un énorme travail de programmation?

Un autre problème que je viens de remarquer est que la fonction que j'ai écrite ne récupère que le type des variables dans le ArrayList et donc s'attend à recevoir un String par exemple alors qu'on lui a passé un tableau de String en paramètre. Ce qui génère également des erreurs de compilation.

Merci de votre aide.
Commenter la réponse de alahassarodriguez
Messages postés
12336
Date d'inscription
mardi 10 février 2004
Statut
Modérateur
Dernière intervention
30 juillet 2012
29
0
Merci
en regle generale, les types qu'on utilise classiquement ont deja la methode equals (String, Integer, Color, etc...)
comme je le disais dans mes deux precedents messages, avec les types primitifs, tu l'as dans le ... (c'est uniquement ce que je disais... donc je ne vois pas ou je me suis trompe...)
Commenter la réponse de coucou747
Messages postés
19
Date d'inscription
jeudi 5 avril 2007
Statut
Membre
Dernière intervention
12 avril 2008
0
Merci
Merci à tous de votre aide.
Commenter la réponse de alahassarodriguez