Listes et fonctions

Résolu/Fermé
Booniak Messages postés 11 Date d'inscription vendredi 1 août 2014 Statut Membre Dernière intervention 29 août 2014 - 6 août 2014 à 13:41
Booniak Messages postés 11 Date d'inscription vendredi 1 août 2014 Statut Membre Dernière intervention 29 août 2014 - 7 août 2014 à 23:13
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 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
6 août 2014 à 20:58
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 vendredi 1 août 2014 Statut Membre Dernière intervention 29 août 2014 5
7 août 2014 à 11:41
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 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
Modifié par KX le 7/08/2014 à 20:11
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 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015 > KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024
Modifié par KX le 7/08/2014 à 20:11
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 vendredi 1 août 2014 Statut Membre Dernière intervention 29 août 2014 5
7 août 2014 à 23:13
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