web-dev-qa-db-fra.com

Récupérer un élément aléatoire de ArrayList

J'apprends Java et j'ai un problème avec ArrayList et RandomGenerator.

J'ai un objet appelé catalogue qui contient une liste d'objets créés à partir d'une autre classe appelée item.

J'ai besoin d'une méthode dans catalogue qui renvoie toutes les informations sur l'un des itemobjects de la liste.
La item doit être sélectionnée au hasard.

import Java.util.ArrayList;
import Java.util.Random;

public class Catalogue
{
    private Random randomGenerator;
    private ArrayList<Item> catalogue;

    public Catalogue ()
    {
        catalogue = new ArrayList<Item>();  
    }

    public Item anyItem()
    {
        int index = randomGenerator.nextInt(catalogue.size());
        return catalogue.get(index);
        System.out.println("Managers choice this week" + anyItem + "our recommendation to you");
    }

Lorsque j'essaie de compiler, j'obtiens une erreur en indiquant la ligne System.out.println en disant .. 

'impossible de trouver la variable de symbole anyItem'

86
Will

anyItem est une méthode et l'appel System.out.println se situe après votre instruction return afin d'éviter toute compilation, car il est inaccessible.

Peut-être envie de le réécrire comme ceci:

import Java.util.ArrayList;
import Java.util.Random;

public class Catalogue
{
    private Random randomGenerator;
    private ArrayList<Item> catalogue;

    public Catalogue()
    { 
        catalogue = new ArrayList<Item>();
        randomGenerator = new Random();
    }

    public Item anyItem()
    {
        int index = randomGenerator.nextInt(catalogue.size());
        Item item = catalogue.get(index);
        System.out.println("Managers choice this week" + item + "our recommendation to you");
        return item;
    }
}
106
Robby Pond
public static Item getRandomChestItem(List<Item> items) {
    return items.get(new Random().nextInt(items.size()));
}
14
Ariel Terrani

Vous devez supprimer le message system.out.println situé en dessous de la return, comme ceci:

public Item anyItem()
{
    randomGenerator = new Random();
    int index = randomGenerator.nextInt(catalogue.size());
    Item it = catalogue.get(index);
    System.out.println("Managers choice this week" + it + "our recommendation to you");
    return it;
}

la déclaration return indique essentiellement que la fonction va maintenant se terminer. tout ce qui est inclus au-delà de la déclaration return qui est également dans la portée de celle-ci entraînera le comportement que vous avez rencontré

4
binnyb

votre empreinte vient après votre retour - vous ne pouvez jamais atteindre cette déclaration. En outre, vous n'avez jamais déclaré que anyItem était une variable. Vous pourriez vouloir

public Item anyItem()
    {
        int index = randomGenerator.nextInt(catalogue.size());
        Item randomItem = catalogue.get(index);
        System.out.println("Managers choice this week" + randomItem.toString() + "our recommendation to you");
        return randomItem;
    }

La partie toString est juste un quickie - vous pouvez ajouter une méthode 'getItemDescription' qui retourne une chaîne utile à cet effet ...

3
hvgotcodes

Ici vous allez, utilisez Generics :

private <T> T getRandomItem(List<T> list)
{
    Random random = new Random();
    int listSize = list.size();
    int randomIndex = random.nextInt(listSize);
    return list.get(randomIndex);
}
2
BullyWiiPlaza

essaye ça 

    public Item anyItem()
    {
        int index = randomGenerator.nextInt(catalogue.size());
        System.out.println("Managers choice this week" + catalogue.get(index) + "our recommendation to you");
        return catalogue.get(index);
    }

Et je vous suggère fortement de vous procurer un livre tel que Beginning Java 2 d'Ivor Horton

1
Augusto

anyItem n'a jamais été déclaré en tant que variable, il est donc logique que cela provoque une erreur. Mais plus important encore, vous avez du code après une instruction return et cela entraînera une erreur de code inaccessible.

0

System.out.println ("Choix des gestionnaires cette semaine" + anyItem + "notre recommandation");

Vous n'avez pas la variable anyItem initialisée ou même déclarée. 

Ce code: + anyItem + 

signifie obtenir la valeur de la méthode toString de l'objet anyItem

La deuxième chose pourquoi cela ne fonctionnera pas. Vous avez System.out.print après la déclaration de retour. Le programme ne pourrait jamais atteindre cette ligne.

Vous voulez probablement quelque chose comme:

public Item anyItem() {
    int index = randomGenerator.nextInt(catalogue.size());
    System.out.println("Managers choice this week" + catalogue.get(index) + "our recommendation to you");
    return catalogue.get(index);

}

au fait: en Java, sa convetion de placer les parenthèses frisées sur la même ligne que la déclaration de la fonction.

0
malejpavouk