2016-05-12 6 views
0

、私はちょうど項目のリストをシャッフルするために、この構造を使用するように言われた:のJava - Javaではシャフリング要素と出力する特定量

List<String> tasks = Arrays.asList("1","2","3","4","5","6","7","8"); 
Collections.shuffle(tasks); 
for(String task : tasks){ 
    System.out.println(task); 
} 

問題を私のプログラムのため、この解決策で私だけランダムにしたいれますユーザーが選択した数の要素を出力します(つまり、ユーザーが8つすべての要素ではなく5つの要素を必要とする場合は、ランダムに出力された5つの要素のみを必要とします)。私は実際にラムダやその形式のforloopを使用したことはありません(私はJavaを完全に使い慣れていません)。私は配列の使い方を知っていて、配列のシャッフルオプションを見つけようとしましたが、何も出てこなかった。また、私はこれを試してみました:

int num = console.nextInt(); 
List<String> tasks = Arrays.asList("1","2","3","4","5","6","7","8"); 
Collections.shuffle(tasks); 
for(int i = 1; i <= num; i++){ 
    String task = tasks; 
    System.out.println(task); 
} 

しかし、明らかに、このフォーマットは(主な理由は、再び、私はその形式がどのように動作するか分からない)非常に、非常に間違っています。リストをシャッフルして、ユーザーが望む要素の量だけを出力するにはどうすればよいですか?

注:私はリストをシャッフルした後

+0

チェック 'Random'クラス – sidgate

+0

リストから特定のインデックスにある要素を取得するために使用できる 'List''get(int index)'メソッドです。例: 'String task = tasks.get(i)'。 – Titus

+0

'for(String task:tasks.subList(0,5){' – BevynQ

答えて

2

tasksすることはできませんList、ありますStringに割り当てることができます。特定のStringをからtaskに割り当てる必要があります。または、別の変数を宣言する必要がないため、taskを完全に削除することもできます。あなたのforループは次のようになります。私もint i=0; i<num;にあなたのコードからint i=1; i<=num;を変更

for (int i=0; i<num; i++) { 
    System.out.println(tasks.get(i)); 
} 

注意を。インデックスは0から始まります。したがって、tasks.get(0)tasks.get(1)などを呼び出すので、ループを0から開始するのが一般的には良い方法です。

+0

あなたの例は完全に機能します!私は通常、配列を使って作業するときにforループでゼロから始めますが、今度は私が思ったからではありませんでした。 numを扱うことになってしまい、 "i =(num-1)"を入れることになり、必要でない部分を複雑にしたくなかった。助けてくれてありがとう! – Ray25Lee

+0

! お役に立てて嬉しいです! :) –

0

のJava 8を持っていない、あなたはIteratorを介してヘッドから要素を取得することができます。

int num = console.nextInt(); 
List<String> tasks = Arrays.asList("1","2","3","4","5","6","7","8"); 
Collections.shuffle(tasks); 
java.util.Iterator<String> taskItr = tasks.iterator(); 
for(int i = 1; i <= num && taskItr.hasNext(); i++){ 
    String task = taskItr.next(); 
    System.out.println(task); 
} 
4

最初の8つの要素を(ランダムに)シャッフルしてから、そのリストのサブセットを返すだけで問題はありませんか?彼らはランダムな順序になりますので、それはあなたが取る元8つの要素のサブセットを問題ではないことを

public class ListTest { 
    public static List<String> getRandomItems(int num) { 
     List<String> tasks = Arrays.asList("1","2","3","4","5","6","7","8"); 
     Collections.shuffle(tasks); 

     return tasks.subList(0, num); 
    } 

    public static void main(String[] args) { 
     // take 5 random elements 
     List<String> randomList = getRandomItems(5); 
     for (String item : randomList) { 
      System.out.println("Found an item: " + item); 
     } 
    } 
} 

注:以下のコードを考えてみましょう。むしろ、重要なのは正しいサイズのサブセットを選択することだけです。シャッフル後

+0

"サブセット"とは何ですか? .subList(0、num); "再整列されたリスト要素を0からnumまで出力する?コピー/ペーストしたときの例はコンパイルされていない(セミコロンが足りないと言う) – Ray25Lee

+0

@ Ray25Lee –

0

彼はどのように多くの要素を必要としないユーザーに尋ねる...は、与えられた数

例に0からList.sublistを使用します。

public static void main(String[] args) { 
    Scanner sc = new Scanner(System.in); 
    List<String> tasks = Arrays.asList("1", "2", "3", "4", "5", "6", "7", "8"); 
    Collections.shuffle(tasks); 
    System.out.println("how many do you need??"); 
    int userAnswer = sc.nextInt(); 
    List<String> res = tasks.subList(0, userAnswer); 
    System.out.println("here are " + res); 
} 
0

もう一つの方法は、猫

int num = console.nextInt(); 
for(String task : tasks){ 
    System.out.println(task); 

    if (num--) <= 0) break; 
} 
0

あなたはStringList<String>をASSINGすることはできませんので、あなたの2番目のコード例でもコンパイルされないでしょうが、皮膚へ。

List<String> tasks = Arrays.asList("1","2","3","4","5","6","7","8"); 
Collections.shuffle(tasks); 
int num = 5; 
Random random = new Random(); 

for(int i = 0; i < num; i++){ 
    System.out.println(tasks.get(random.nextInt(tasks.size()))); 
} 
:あなたがしたい場合は、単に list.size()と出力に対応する位置にある要素の範囲0で乱数を取得するために Randomを使用することができ、リストからの出力のランダムな要素に String task = tasks.get(i);

を使用する必要があると思います

ここで問題となるのは、(擬似)ランダムに生成された番号のために同じ要素を複数回出力する可能性があるということです。この問題を解決する方法は、重複を許可しない設定を、使用し、そしてあなたがあなたのリストから十分なユニークな要素を持ってまでそれを埋めるためにある:私はあなたが探していると思う

List<String> tasks = Arrays.asList("1","2","3","4","5","6","7","8"); 
Collections.shuffle(tasks); 
int num = 5; 
Random random = new Random(); 
Set<String> selectedTasks = new HashSet<String>(); 

do { 
    selectedTasks.add(tasks.get(random.nextInt(tasks.size()))); 
} while (selectedTasks.size() < num); 

System.out.println(selectedTasks); 
関連する問題