Contourner l'inexistance de Arrays.equals(String,String)

jmg02001 Messages postés 78 Date d'inscription jeudi 6 février 2003 Statut Membre Dernière intervention 4 octobre 2004 - 27 mars 2003 à 11:58
jmg02001 Messages postés 78 Date d'inscription jeudi 6 février 2003 Statut Membre Dernière intervention 4 octobre 2004 - 28 mars 2003 à 11:13
Bonjour sauriez vous comment comparer deux tableaux de String sachant que Arrays.equals(*,*) n'est pas implémenté pour des String
ou sauriez vous comment transformer un String[] en Object[] car Arrays.equals peut comparre des objets.
merci

7 réponses

cs_Duss Messages postés 890 Date d'inscription lundi 8 avril 2002 Statut Membre Dernière intervention 29 juillet 2004 11
27 mars 2003 à 13:09
salut,
ben ce que tu peux faire, c'est tester si tes tableaux ont la meme taille et dans ce cas, tu les parcours en faisant des equals sur les cases de meme index !!
Duss
0
jmg02001 Messages postés 78 Date d'inscription jeudi 6 février 2003 Statut Membre Dernière intervention 4 octobre 2004
27 mars 2003 à 13:22
merci Duss

on peut faire aussi:

toutes les classes heritent de java.lang.Objet donc on peut faire aussi:

String str = "toto";
Object obj = (Object)str;

Du fait de cet héritage, une méthode qui a comme paramètres des objets,
peut être appelee en lui passant comme argument n'importe quel objet (String, String [] etc.

->

Object[] ligneo = new Object[1];
ligneo[0] = ligne;
Object[] ligne_tempono = new Object[1];
ligne_tempono[0] = ligne_tempon;

if (!Arrays.equals(ligne_tempono,ligneo))...
0
jmg02001 Messages postés 78 Date d'inscription jeudi 6 février 2003 Statut Membre Dernière intervention 4 octobre 2004
27 mars 2003 à 14:26
désolé mais cela ne marche pas en fait:
ceci devrais afficher =1 car les tableaux sont identiques mais c'a m'affiche !=1 sauriez vous pourquoi?
merci de vos élucidations

String[] ligne_tempon1 = null;
String [] ligne_aff1 = new String[1];
boolean premiere1 = true;

ligne_aff1[0] = "0";
for (int i = 0 ; i<2 ; i++)
{
if (!premiere1) {
Object[] ligneo1 = new Object[1];
ligneo1[0] = ligne_aff1;
Object[] ligne_tempono1 = new Object[1];
ligne_tempono1[0] = ligne_tempon1;

if (!Arrays.equals(ligne_tempono1, ligneo1))
out.println("!=1");
else
out.println("=1");
}
ligne_tempon1 = (String[]) ligne_aff1.clone();
premiere1 = false;
}
0
cs_Duss Messages postés 890 Date d'inscription lundi 8 avril 2002 Statut Membre Dernière intervention 29 juillet 2004 11
27 mars 2003 à 14:42
salut,
ben surement qu a l interieur de la methode, Arrays se sert de equals pour comparer les elements des tableaux et la c est normal que ca ne marche pas car sur object il compare les hashcodes.
A mon avis tu ferais mieux de prendre ma solution quitte a deriver de Arrays et de mettre une methode qui compare les tab de String
Duss
0

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

Posez votre question
jmg02001 Messages postés 78 Date d'inscription jeudi 6 février 2003 Statut Membre Dernière intervention 4 octobre 2004
27 mars 2003 à 15:22
merci beaucoup mais

1)les hashcodes c'est différent de ce qui il y a à l'intérieur du tableau qui est dans l'objet! bizard ce hashcodes a oui en plus des données du tableau il y a d'autres paramettres tel que le nom et autre c'est ca?
sinon on peut faire aussi:

import java.util.Arrays;

public class Woombat {
public static void main(String[] args) {
String[] t1 = new String[] {"George", "Bush"};
String[] t2 = new String[] {"Subtilité", "Finesse"};
System.out.println("Arrays.equals(t1, t2)=" + Arrays.equals(t1, t2));
}
}

2)mais la comprend pas pourquoi java.util.Arrays y arrie car c'est 2 String[]! tu comprend toi?
0
cs_Duss Messages postés 890 Date d'inscription lundi 8 avril 2002 Statut Membre Dernière intervention 29 juillet 2004 11
28 mars 2003 à 09:17
salut,
le hashcode est une valeur unique calculée par java.
la plupart du temps elle représente l'adresse mémoire de l objet. c est pour ca que si la comparaison ce fait dessus il n y arrive pas !!
Duss
0
jmg02001 Messages postés 78 Date d'inscription jeudi 6 février 2003 Statut Membre Dernière intervention 4 octobre 2004
28 mars 2003 à 11:13
merci bien mais je pense que je déclare deux références d'objets vers respectivement un tableau de String et un tableau d'Object.
Code:

String[] ligne_tempon1 = null;
Object[] ligne_tempono1 = new Object[1];


Ca veut dire que l'élément de ligne_tempono1 doivt contenir une référence à un objet Object.

Ensuite:
Code:
ligne_tempono1[0] = ligne_tempon1;

le '=' est l'opérateur d'affectation, alors en gros ligne_tempono1[0], prend bien la valeur de ligne_tempon1.
1) comme ligne_tempon1 est une référence vers un objet, ligne_tempono1[0] prend comme valeur la même référence, ie ils référencent le même objet (le même tableau de String), tu as bien copié les valeurs puisque ce sont des références !
2) C comme si tu copiais des adr mémoire, à la différence que le typage statique de java te l'autorise dans la mesure où tu as déclaré que ligne_tempono1[0] référence un objet de type Object et qu'effectivement la valeur que tu lui affecte est bien une référence à un objet Object (c une référence à un objet tableau de String, qui hérite de Object, tout va bien)

Si après tu changes la valeur de ligne_tempon1:

Code:
ligne_tempon1 = uneAutreRefDeTab;

ligne_tempon1 référence un autre objet, mais tu n'as pas touché à la valeur de ligne_tempono1[0], ie comme c une référence, il référence tjrs l'objet anciennement référencé par ligne_tempon1. Maintenant les ligne_tempon1 et ligne_tempono1 référencent deux objets diff.

Pour répondre à ta 2nd question, je dirais que = copie toujours des valeurs.

Si tu fais ca:
Code:
ligne_tempon1 = new Object[3]

new Object[3]: en gros tu reserves de la mémoire pour ton nouveau tab
ligne_tempon1 =: avec ton espace mémoire réservé tu l'adr pour y accéder, et tu la "copie", tu l'affectes à ligne_tempon1.

qu'en penses tu?
0
Rejoignez-nous