-1

重複の可能性:
ArrayList から繰り返し要素を削除するにはどうすればよいですか?

ArrayList に格納されている重複した番号 (ある場合) を置き換えたい。ランダム変数の数値を取得しました。これがクラスです。

import java.util.*;

public class RandomNumbers {
// instance variables
private ArrayList<Integer> randomNumberList = new ArrayList<Integer>(); 
private Random randomNums = new Random();

public RandomNumbers(){
    // generating and adding random numbers to the list
    for (int i=0; i<MemoryGame.totalAnswers; i++)
        randomNumberList.add(randomNums.nextInt(32));

    System.out.println("Numbers in the list: " + randomNumberList);
    System.out.println("");
}

public ArrayList<Integer> getRandomNumbers(){
    return randomNumberList;
}
}

私の教科書には、番号を追加、削除、取得する方法は記載されていますが、重複した番号を置き換える方法は記載されていません。

ありがとう。

4

4 に答える 4

2

に限定されていない場合はArrayListHashSet<Integer>代わりに (またはより良いのはLinkedHashSet ) を使用してください。HashSet<Integer>コレクションに重複した値がないことを保証LinkedHashSet<Integer>し、同じことを行い、アイテムの順序も保持します。

がどうしても必要な場合はArrayList、次のようにします。

public RandomNumbers(){
    HashSet<Integer> set = new HashSet<Integer>();

    // generating and adding random numbers to the list
    //for (int i=0; i<MemoryGame.totalAnswers; i++)
    while (set.size()<MemoryGame.totalAnswers)
        set.add(randomNums.nextInt(32));

    randomNumberList.addAll(set);  // dump the set in your ArrayList

    System.out.println("Numbers in the list: " + randomNumberList);
    System.out.println("");
}

また、 の場合は、代わりにランダム リストMemoryGame.totalAnswers == 32を使用してこのプロセスを高速化できます。

public RandomNumbers(){
    // generating and adding random numbers to the list
    for (int i=0; i<MemoryGame.totalAnswers; i++)
        randomNumberList.add(i);

    Collections.shuffle(randomNumberList);

    System.out.println("Numbers in the list: " + randomNumberList);
    System.out.println("");
}

**更新**

以来MemoryGame.totalAnswers == 8、最後のスニペットは忘れてください。誰かがそれを必要とするなら、私はそこに残します。pstの提案に従って、 a の使用をSet完全にスキップできます。

public RandomNumbers(){
    // generating and adding random numbers to the list
    for (int i=0; i<32; i++)
        randomNumberList.add(i);

    Collections.shuffle(randomNumberList);

    // keep only the first ones we need
    randomNumberList.removeRange(MemoryGame.totalAnswers + 1, 32);

    System.out.println("Numbers in the list: " + randomNumberList);
    System.out.println("");
}
于 2012-12-29T02:55:08.707 に答える
1

位置の要素を置き換えるには、次のset()メソッドを使用します。

randomNumberList.set(index, element);

もちろん、最初にどの要素が複製されているかを見つけるロジックはあなた次第です。問題に重複した数値を使用する意味がない場合は、Setデータ構造を使用することをお勧めします (たとえば、反復時に挿入順序を維持することが重要な場合はHashSet、またはLinkedHashSet )。希望のサイズ。

于 2012-12-29T02:58:04.607 に答える
1

最終的な目的が個別の数字のランダムなリストであり、可能な数字の範囲が必要な結果の数よりもそれほど大きくない場合は、重複を置き換えるのではなく、シャッフルを検討してください。

于 2012-12-29T03:13:41.043 に答える
0

あなたが望むのはあなたの最後のコメントの通りです

0 ~ 31 の 8 つのランダムで繰り返されない数字

インスタンス変数、乱数生成コード、またはインスタンス メソッドは必要ありません。
必要なのはこれだけです:

public static List<Integer> getRandomNumbers() {
    List<Integer> list = new ArrayList<Integer>();
    for (int i = 0; i < 32; i++)
        list.add(i);
    Collections.shuffle(list);
    return list.subList(0, 8);
}
于 2012-12-29T05:18:12.383 に答える