Possibilités Java, types et tableaux

Résolu
alahassarodriguez Messages postés 19 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 12 avril 2008 - 12 avril 2008 à 00:32
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)

10 réponses

cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 129
12 avril 2008 à 14:45
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
3
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
12 avril 2008 à 01:35
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.
0
cs_DARKSIDIOUS Messages postés 15814 Date d'inscription jeudi 8 août 2002 Statut Membre Dernière intervention 4 mars 2013 129
12 avril 2008 à 06:03
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
0
alahassarodriguez Messages postés 19 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 12 avril 2008
12 avril 2008 à 07:59
Merci pour vos réponses. Je vais essayer pour le générics.

Bonne journée
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
alahassarodriguez Messages postés 19 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 12 avril 2008
12 avril 2008 à 09:27
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[])
0
alahassarodriguez Messages postés 19 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 12 avril 2008
12 avril 2008 à 09:29
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.
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
12 avril 2008 à 12:26
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...
0
alahassarodriguez Messages postés 19 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 12 avril 2008
12 avril 2008 à 13:13
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.
0
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
12 avril 2008 à 13:20
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...)
0
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
Merci à tous de votre aide.
0
Rejoignez-nous