Sortie de tableau

Fermé
helloword95 - 22 mai 2017 à 15:05
KX Messages postés 16641 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 4 décembre 2022 - 23 mai 2017 à 13:45
Bonjour,

J'ai une ArrayIndexOutOfBoundsException mais je ne comprend pas pourquoi.
Je cherche dans un tableau quelle prénom revient le plus souvent pour ensuite insérer la celebrite donc le prénom est le plus commun dans un nouveau tableau.

	public Celebrite[] celebAvecPrenomLePlusCommun(){
		int nombreCommun = 0;
		Celebrite[] tableDePrenomCommun = new Celebrite[nombreCommun];
		for (int i = 0; i < nombreDeCelebrites-1; i++){
			if (listeDeCelebrites[i].getPrenom().equals(listeDeCelebrites[i+1].getPrenom())){
				Celebrite celebrite = listeDeCelebrites[i];
				nombreCommun++;
				tableDePrenomCommun[i] = celebrite;
			}
		}
		return tableDePrenomCommun;
	}



1 réponse

KX Messages postés 16641 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 4 décembre 2022 2 984
22 mai 2017 à 17:55
Bonjour,

Sur quelle ligne de code as tu l'exception et avec quelle valeur associée ?

Je pense à une incohérence entre nombreDeCelebrites et listeDeCelebrites.length
0
pkpkmépkpk Messages postés 341 Date d'inscription samedi 14 mai 2011 Statut Membre Dernière intervention 14 janvier 2018 51
22 mai 2017 à 18:17
Bonjour,

Je pense plutôt que le problème se situe à
tableDePrenomCommun[i]
car
tableDePrenomCommun.length == 0
.
0
helloword95
22 mai 2017 à 23:44
L'erreur survient à la ligne 9. Le nombres de celebrites (la taille logique) et de 5 et la taille physique de 20.
0
KX Messages postés 16641 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 4 décembre 2022 2 984
23 mai 2017 à 07:15
Le problème est donc l'hypothèse de pkpkmépkpk.

Tu fais int nombreCommun = 0; puis Celebrite[] tableDePrenomCommun = new Celebrite[nombreCommun]; donc tableDePrenomCommun a une taille de 0.

En faisant nombreCommun++ tu augmentes la taille de nombreCommun, mais ça n'augmente pas rétroactivement la taille de tableDePrenomCommun qui est toujours de 0.

Donc tableDePrenomCommun[i] = celebrite; plante pour i=0 car il n'y a pas de case tableDePrenomCommun[0]

Il faudrait peut-être que tu utilises plutôt des listes que des tableaux si ta taille de données est dynamique.
0
helloword95
23 mai 2017 à 09:49
D'accord, mais enfaite j'aimerai retourner un tableau avec une taille correspondant au nombre de celebrites
0
KX Messages postés 16641 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 4 décembre 2022 2 984
23 mai 2017 à 13:45
Je pense que c'est une erreur de travailler avec des tableaux.
D'ailleurs tes attributs s'appellent "liste" ce qui est tout à fait cohérent...

Notons par ailleurs que depuis Java 8 on peut éviter de faire soit même ce genre de code avec boucle for, if imbriqué, ajout dans des listes etc.

À la place on utilise des streams et les méthodes utilitaires associées.

Exemple :

public static List<Celebrite> celebAvecPrenomLePlusCommun(final List<Celebrite> celebrites) {
    return celebrites.stream()
            // on regroupe les célébrités par prénom
            .collect(Collectors.groupingBy(Celebrite::getPrenom))
            .values().stream()
            // on ne garde que la liste la plus grande
            .max(Comparator.comparingInt(List::size))
            .get();
}

Mon code de test :

import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

public class Celebrite {

    private final String prenom, nom;

    public Celebrite(final String prenom, final String nom) {
        this.prenom = prenom;
        this.nom = nom;
    }

    public String getPrenom() {
        return prenom;
    }

    public String getNom() {
        return nom;
    }

    @Override
    public String toString() {
        return prenom + " " + nom;
    }

    public static List<Celebrite> celebAvecPrenomLePlusCommun(final List<Celebrite> celebrites) {
        return celebrites.stream().collect(Collectors.groupingBy(Celebrite::getPrenom)).values().stream().max(Comparator.comparingInt(List::size)).get();
    }

    public static void main(final String[] args) {
        final List<Celebrite> list = Arrays.asList(//
                new Celebrite("P1", "N1"), //
                new Celebrite("P1", "N2"), //
                new Celebrite("P2", "N3"), //
                new Celebrite("P2", "N4"), //
                new Celebrite("P2", "N5"), //
                new Celebrite("P3", "N6"));
        System.out.println(Celebrite.celebAvecPrenomLePlusCommun(list));
    }
}

Cela n'affiche que les noms N3, N4 et N5 car P2 est le prénom le plus représenté.
0