Listes et fonctions

Résolu
Booniak Messages postés 11 Date d'inscription   Statut Membre Dernière intervention   -  
Booniak Messages postés 11 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour, j'ai écrit un truc surement blindé d'erreurs, quoi qu'il en soit j'écope de ce message en général output:

--------------------Configuration: exo_10 - JDK version 1.8.0_11 <Default> - <Default>--------------------
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.ArrayList.elementData(ArrayList.java:403)
at java.util.ArrayList.get(ArrayList.java:416)
at exo_10.main(exo_10.java:17)

Process completed.

Voila mon essai agrémenté de mes interrogations en commentaires:




import java.util.ArrayList;
 import javax.swing.*;
public class exo_10 {
    
    public static void main(String[] args) 
    	{
    	ArrayList<Integer> liste= new ArrayList<Integer>();
//l'utilisateur ajoute des données dans la liste, jusqu'a la saisie de -1.
    	   while(liste.get(liste.size()-1)!=-1)
    	     {
    	       liste.add(Integer.parseInt(JOptionPane.showInputDialog("Ecrivez une valeur: ")));
    	         }
           
                     int compteur, somme=0;
/*Calcul de la somme des valeurs de la liste,
 * j'aimerais le faire en utilisant des accesseurs comment faire?*/ 
                    	for (compteur=0;compteur<liste.size();compteur++)
                         	{
    	                       	somme+=liste.get(compteur);
                                    	}
/*Affichage des valeurs en dessous de la moyenne,
 * encore une fois la procédure est surement fausse et pas optimisé
 *j'aimerais aussi mettre le tout 
 *(calcul somme + valeurs inférieures à la moyenne) sous forme de fonction
 *mais il faudrait qu'elle retourne plusieur valeurs? Comment faire?*/                                    	
    	
    	System.out.println("Les valeurs inférieures à la moyennes sont: ");
    	
    	
    		for(compteur=0;compteur<liste.size();compteur++)
    		{
    			if(liste.get(compteur)<somme/liste.size())
    			{
    				System.out.println(+ liste.get(compteur));
    				
    		                                         }
    		                                           }
    	                                                 }
                                                           }

Sur ce, je vais noyer ma tristesse dans le Dr.pepper.

2 réponses

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Bonjour,

Ta ligne 17 c'est ça :

    	   while(liste.get(liste.size()-1)!=-1)

Et ton exception est relativement explicite :
ArrayIndexOutOfBoundsException: -1 
Ici -1 c'est la valeur que tu passes au get, ce qui est normal car la liste est vide, donc liste.size()=0, d'où liste.size()-1=-1 et liste.get(-1)=erreur.

Ce qu'il faudrait faire c'est :

    	   while(liste.isEmpty() || liste.get(liste.size()-1)!=-1)

Comme ça, si la liste est vide, tu ne regardes pas la valeur de son dernier élément alors qu'il n'existe pas...
1
Booniak Messages postés 11 Date d'inscription   Statut Membre Dernière intervention   5
 
Ah ouais j'aurais pu évité ça même avec mes faibles connaissance en faisant
 
if(liste.size()==0)
liste.add...;
while(liste.get(liste.size()-1)!=-1)
liste.add...;

Sinon le || je comprend à quoi il sert dans cette situation mais globalement, ça veut dire:
<=si cette déclaration est fausse|| on appllique celle la=>
? On peut les enchainer en mode : case1||case2||case3..?
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Le || c'est un "ou" et en Java il est paresseux, ça veut dire que si la première condition est vraie on renvoie vrai pour toute l'expression, on ne calcule donc pas la deuxième condition (ce qui nous arrange vu qu'elle provoque une exception). Par contre si la première condition est fausse on calcule la deuxième puis la troisième, etc. jusqu'en avoir une qui est vraie, si la dernière est fausse on renvoie faux pour l'expression.

En gros
boolean x = x1 || x2 || x3 || ... || xn;
est équivalent à :

boolean x;
if (x1)
    x = true;
else if (x2)
    x = true;
else if (x3)
    x = true;
...
else if (xn)
    x = true;
else
    x = false;

Remarque : cela fonctionne sur le même principe avec le && mais dans l'autre sens. Le premier faux l'emporte et on obtient vrai que si tout est vrai (c'est un "et").
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020 > KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention  
 
Remarque : sur le même principe de code paresseux il est préférable d'utiliser
liste.isEmpty()
qui va renvoyer faux dès qu'elle rencontre le premier élément (s'il y en a) alors que
liste.size()==0
requiert de parcourir toute la liste pour connaître sa taille exacte alors qu'on n'en a pas besoin.

Ps. Ça c'est de la théorie, en pratique la taille de la liste est généralement stockée dans une variable donc il n'est pas nécessaire en réalité de tout recalculer à chaque fois, mais c'est le genre de choses dont tu ne peux jamais être totalement sûr...
0
Booniak Messages postés 11 Date d'inscription   Statut Membre Dernière intervention   5
 
Oui c'est ce que j'avais compris , bien sur liste.isEmpty() est mieux c'est juste que j'était passé à coté en passant en revu la liste des outils de list, bref ça rentre doucement mais surement...euh...j'ai rien dis.
@+ dans le bus!
0