-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

如果您不限于ArrayList,请改用 a HashSet<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的建议Set完全跳过 a 的使用:

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数据结构(例如:HashSetLinkedHashSet如果在迭代时保留插入顺序对您很重要)并继续向集合中添加随机元素,直到它有所需的大小。

于 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 回答