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 -
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:
Sur ce, je vais noyer ma tristesse dans le Dr.pepper.
--------------------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.
A voir également:
- Listes et fonctions
- Fonction si et - Guide
- Listes déroulantes excel - Guide
- Listes déroulantes en cascade excel - Guide
- Codes secrets Android : accéder aux fonctions cachées - Guide
- Liste des maladies et leurs traitements - Télécharger - Bureautique
2 réponses
Bonjour,
Ta ligne 17 c'est ça :
Et ton exception est relativement explicite :
Ce qu'il faudrait faire c'est :
Comme ça, si la liste est vide, tu ne regardes pas la valeur de son dernier élément alors qu'il n'existe pas...
Ta ligne 17 c'est ça :
while(liste.get(liste.size()-1)!=-1)
Et ton exception est relativement explicite :
ArrayIndexOutOfBoundsException: -1Ici -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...
Ah ouais j'aurais pu évité ça même avec mes faibles connaissance en faisant
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..?
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..?
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
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").
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").
Remarque : sur le même principe de code paresseux il est préférable d'utiliser
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...
liste.isEmpty()qui va renvoyer faux dès qu'elle rencontre le premier élément (s'il y en a) alors que
liste.size()==0requiert 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...