web-dev-qa-db-ja.com

ArrayListからランダムなアイテムを取得する

Javaを学習していますが、ArrayListRandomGeneratorに問題があります。

catalogueという別のクラスから作成されたオブジェクトの配列リストを持つitemというオブジェクトがあります。

リスト内のcatalogueobjectsのいずれかに関するすべての情報を返すメソッドitemが必要です。
itemはランダムに選択する必要があります。

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");
    }

コンパイルしようとすると、System.out.println行を指すエラーが表示されます。

「シンボル変数anyItemが見つかりません」

94
Will

anyItemはメソッドであり、System.out.println呼び出しはreturnステートメントの後にあり、到達できないためとにかくコンパイルされません。

次のように書き直したい場合があります。

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;
    }
}
107
Robby Pond
public static Item getRandomChestItem(List<Item> items) {
    return items.get(new Random().nextInt(items.size()));
}
16
Ariel Terrani

あなたが戻った後にあなたのプリントが来ます-あなたはその文に到達することはできません。また、anyItemを変数として宣言したことはありません。あなたが望むかもしれません

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;
    }

ToString部分はただの急ごしらえです-この目的に役立つ文字列を返すメソッド 'getItemDescription'を追加したいかもしれません...

4
hvgotcodes

次のように、returnの下からsystem.out.printlnメッセージを削除する必要があります。

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;
}

returnステートメントは、基本的に関数が終了することを示しています。 returnステートメントを超えて含まれ、そのスコープ内にあるものはすべて、発生した動作になります

4
binnyb

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

これを試して

    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);
    }

Ivor Horton's Beginning Java 2などの本を入手することを強くお勧めします。

1
Augusto

私がコードを見ることができるように
System.out.println("Managers choice this week" + anyItem + "our recommendation to you");
に到達できません。

0
user2763281

anyItemは変数として宣言されていないため、エラーが発生することは理にかなっています。しかし、さらに重要なことは、returnステートメントの後にコードがあるため、到達不能なコードエラーが発生することです。

System.out.println( "今週のマネージャーの選択" + anyItem + "あなたへのおすすめ");

変数anyItemが初期化されていないか、宣言されていません。

このコード:+ anyItem +

object anyItemのtoStringメソッドの値を取得することを意味します

なぜこれが機能しないのかということ。 returnステートメントの後にSystem.out.printがあります。プログラムが行に到達することはありませんでした。

おそらく次のようなものが必要です:

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);

}

btw:Javaで、関数の宣言と同じ行に中括弧を配置するという概念。

0
malejpavouk