Tableaux en java

Résolu/Fermé
Signaler
Messages postés
161
Date d'inscription
dimanche 23 décembre 2007
Statut
Membre
Dernière intervention
30 août 2012
-
Messages postés
161
Date d'inscription
dimanche 23 décembre 2007
Statut
Membre
Dernière intervention
30 août 2012
-
Bonjour,

Peut on déclarer un tableau à 2 dimension en string comme suit :

String tableau[][] = { {a,b,c,d,e},{1,3,5,7,9} };

ensuite peut en faire un test comme suit
si x>=5 alors y = c
c'est a dire utiliser les caractères comme s'ils étaient des nombres .
Merci

5 réponses

Messages postés
16439
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
1 décembre 2021
2 918
"utiliser les caractères comme s'ils étaient des nombres", les String paraissent alors plutôt inadaptés, il vaudrait mieux mettre des caractères et des chiffres dans les tableaux (attention : les caractères s'écrivent entre apostrophes)

Object[][] tableau ={{'a','b','c','d','e'},{1,3,5,7,9}};
Ensuite, pour ton test, il faut faire ça manuellement avec une petite boucle (je suppose que le tableau d'entiers est trié par ordre croissant).

public static void main(String...args)
{
	Object[][] tableau ={{'a','b','c','d','e'},{1,3,5,7,9}};

	int x=5;
	char y=0;
	
	for (int i=0; i<tableau[1].length; i++)
		if (x >= (int) tableau[1][i])
			y = (char) tableau[0][i];
	
	System.out.printf("x>=%d y='%c'\n",x,y);
}

Remarque : si ton test avait été une égalité "si x==5 alors y=c", on aurait pu utiliser une Map<Integer,Character> pour indexer chaque caractère.

public static void main(String...args)
{
	Map<Integer,Character> map = new TreeMap<Integer,Character>();
		map.put(1, 'a');
		map.put(3, 'b');
		map.put(5, 'c');
		map.put(7, 'd');
		map.put(9, 'e');
		
	int x = 5;
	char y = map.get(x);
	
	System.out.printf("x==%d y='%c'\n",x,y);
}
Messages postés
161
Date d'inscription
dimanche 23 décembre 2007
Statut
Membre
Dernière intervention
30 août 2012
8
Merci pour la réponse elle m'a appris deux choses

d'abord la solution à mon problème.
Et si je te suis bien on peut déclarer un tableau avec des entiers et des string c'est ce que je cherchais, je pensais que ce n'était pas possible.

Encore une fois merci
Messages postés
16439
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
1 décembre 2021
2 918
En fait ce ne sont pas des entiers et des String, mais des entiers et des caractères !
(Les String sont entre guillemets et les caractères entre apostrophes)

On peut déclarer un tableau avec des types différents grâce au polymorphisme puisque toutes les classes héritent de la classe Object, ainsi on fait un tableau d'Object et on met dedans tout ce que l'on veut.

Cependant, on perd de l'information, car on ne sait plus si l'Object en question est un entier, un caractère ou autre chose. C'est pour ça qu'il faut explicitement mettre les cast (int) et (char) comme je l'ai fait, pour redonner au programme l'information que l'on a perdu en passant aux Object.

Autre chose qui est cachée, c'est que ce n'est pas int et char qui héritent de Object, mais leurs classes enveloppes Integer et Character (la conversion est automatique). Ce qui signifie que dans le tableau d'Object je n'ai pas des int mais des Integer, et je n'ai pas des char mais des Character.
Le principal avantage est de pouvoir utiliser leur hiérarchie de classe, et leurs méthodes spécifiques, et le principal inconvénient c'est la consommation en mémoire, puisque les Object sont plus gros (22 octets pour Integer et Character, contre 2 octets pour char, et 4 pour int)
Messages postés
161
Date d'inscription
dimanche 23 décembre 2007
Statut
Membre
Dernière intervention
30 août 2012
8
Merci pour les précisions, j'ai appris beaucoup d'autre chose

mais peut on aussi déclarer des string avec des entiers, par exemple au lieu des lettres a,b,c on aurait des phrases? Le but est de simuler un tableau d'une base de données dans notre programme.

Autre question pour le code

for (int i=0; i<tableau[1].length; i++)
if (x >= (int) tableau[1][i])
y = (char) tableau[0][i];

ne manque t'il pas des scopes '{} apres le for et le if?

merci beaucoup encore une fois.
Messages postés
16439
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
1 décembre 2021
2 918
On peut déclarer des String avec n'importe quel caractère Unicode dedans, dont des entiers, mais dans ce cas je ne vois plus le trop le rapport avec ton code de tout à l'heure... En tout cas on ne pourras pas faire de comparaison >= directement sur des String, il faudra parser les String en int, avec Integer.parseInt(String).

Les accolades { } ne sont pas obligatoires lorsqu'il y a une seule instruction à exécuter comme c'était le cas dans mon code plus haut. On peut également ne pas avoir d'instructions du tout, et ainsi terminer directement la boucle ou la condition par un point-virgule, ce qui arrive lorsque le code à exécuter renvoie directement le booléen à tester. Exemple :

while (attendre());
Messages postés
161
Date d'inscription
dimanche 23 décembre 2007
Statut
Membre
Dernière intervention
30 août 2012
8
En fait pour faire simple j'ai mis qu'un seul caractere mais dans mon cas J'ai par exemple des mots qui s'affichent dans le cas ou l'on saisit par exemple un chiffre superieur a 25 et un autre mot si le chiffre est inferieur a 25 et apres je dois enregistrer tous cela. c'est pour cette raison que J'ai posé la question si on pouvait mettre des nombres et etring dans un même tableau.

Tes réponses sont instructive, J'ai beaucoup appris.

Merci
Messages postés
161
Date d'inscription
dimanche 23 décembre 2007
Statut
Membre
Dernière intervention
30 août 2012
8
Une autre question

dans ton code :

for (int i=0; i<tableau[1].length; i++)
if (x >= (int) tableau[1][i])
y = (char) tableau[0][i]; // ne serait ce pas (char) tableau[i][1] pourquoi tu as utilisé cette notation.

Le tableau que j'ai est ainsi fait

Object[][] tableau ={{'faible','faible','faible','moyen','moyen','moyen','fort','fort','fort'},{1,2,3,4,5,6,7,8,9}};

si valeur< =3 faible
sinon si <=6 moyen
etc.

Merci
Messages postés
16439
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
1 décembre 2021
2 918
Il faut que tu testes le code au fur et à mesure !

Les Strings sont entre guillemets, tu n'auras donc pas 'faible', mais "faible" etc.
De plus tableau[i][1] va forcément planter avec i>1 car c'est bien tableau[0][i] qu'il faut mettre, même si maintenant le cast doit être (String) et non plus (char), en effet tableau[0]={"faible","faible","faible"...}

Cependant l'intérêt de ton double tableau est nul, ça te complique la vie plus qu'autre chose, il vaudrait mieux avoir deux tableaux distincts, un de chaque type, ce qui évite de manipuler les casts et les enveloppeurs :

String[] attributs = {"faible","faible","faible","moyen","moyen","moyen","fort","fort","fort"};
int[] valeurs = {1,2,3,4,5,6,7,8,9};

int x=5;
String y=null;

for (int i=0; i<valeurs.length; i++)
    if (x >= valeurs[i])
        y = attributs[i];

Cependant, cela ne sert à rien de faire un tel code si c'est pour mettre toutes les valeurs dans le tableau et pour doubler les attributs, ces deux tableaux donneront exactement les même résultats

String[] attributs = {"faible","moyen","fort"};
int[] valeurs = {1,4,7};

Comprendre :
si x>=7 alors y="fort"
        sinon si x>=4 alors y="moyen"
                      sinon si x>=1 alors y="faible"
                                    sinon y=null
Messages postés
161
Date d'inscription
dimanche 23 décembre 2007
Statut
Membre
Dernière intervention
30 août 2012
8
très bien, je vais mettre résolu et je pourrais même mettre plus que résolu, franchement merci pour le cour